我的问题很简单,也许答案不是。
在C ++中(在Win7上使用英特尔C ++ 13.1编译器) 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尚未加载或静态未正确实例化。请注意,没有线程,每个调用都是同步的(至少在我的代码中!)
如果您有任何想法或建议,我们将不胜感激。谢谢!
更新1
如果我告诉你我想要的东西而不是我做的事情,也许会更容易......
我想要一个在DLL加载时自动实例化的变量。这个变量将被应用程序(.exe)中的单例注册(ptr存储在std :: set中)。应用程序单例不知道DLL,但DLL知道应用程序单例。因此,在DLL加载时,我希望var实例化现在,然后在应用程序单例中注册自己。这就是为什么我在DLL中声明了var static并在那里实例化它。注册在cTor中完成。
我最初的问题是:静态实例化是在DLL加载时发生还是可能会被延迟?我问这个问题,因为有时我观察到奇怪的行为,它看起来像一个异步问题...... ???
答案 0 :(得分:0)
加载DLL时会发生静态初始化,但根据链接器选项,DLL可以是需求加载的。请注意,如果您在DLL和主程序中都包含该类,但是您没有从DLL中导出它,那么您将获得两个代码副本,并且可能会有两个副本(类)静态变量。因此,当另一个副本实际上已经存在时,您可能会对一个未初始化的副本感到困惑。
但请确保您首先了解延迟加载DLL的链接器选项。