首页 文章

全局静态变量实例化行为

提问于
浏览
3

我的问题很简单,也许答案不是 .

在C(在Win7上使用Intel C 13.1编译器) global static variables 总是在执行 main() 之前实例化?如果不是,它是否依赖于编译选项(如 /Ox )?

如果它们在 DLL 中声明和定义,它是否相同?

这是一个案例:

我有类似的东西:

// in DLL.h
class MyClass
{
public:
    MyClass();
};

static MyClass *sgMyClassPtr;

// in DLL.cpp
MyClass *sgMyClassPtr = new MyClass;

MyClass::MyClass()
{
    // Code to execute here
}

请注意,我省略了导出声明,但它已正确导出 .

从我的主应用程序代码来看,似乎 MyClass::MyClass() 在运行时并不总是被执行 . 我真的不明白,但看起来如果DLL尚未加载或静态未正确实例化 . 请注意,没有线程,每个调用都是同步的(至少在我的代码中!)

如果您有任何想法或建议,我们将不胜感激 . 谢谢!


UPDATE 1

也许如果我告诉你我想要的东西而不是我做的事情会更容易......

我想要一个在DLL加载时自动实例化的变量 . 这个变量将被应用程序(.exe)中的单例注册(ptr存储在std :: set中) . 应用程序单例不知道DLL,但DLL知道应用程序单例 . 因此,在DLL加载时,我希望var实例化 right now 然后在应用程序单例中注册自己 . 这就是为什么我在DLL中声明了var static并在那里实例化它 . 注册在cTor中完成 .

我最初的问题是:静态实例化是在DLL加载时发生还是可能被延迟?我问这个问题,因为有时候我会观察到奇怪的行为,看起来像是一个异步问题... ???

1 回答

  • 0

    加载DLL时会发生静态初始化,但根据链接器选项,DLL可以是需求加载的 . 请注意,如果您在DLL和主程序中都包含该类但不从DLL导出它,那么您将获得两个代码副本,并且可能有两个(类)静态变量副本 . 因此,当另一个副本实际上已经有一个副本没有被初始化时,你可能会感到困惑 .

    但请确保您首先了解延迟加载DLL的链接器选项 .

相关问题