我的问题很简单,也许答案不是。
在 C++ 中(在 Win7 上使用 Intel 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 加载时发生还是可能会延迟?我问这个问题是因为有时我观察到奇怪的行为,它看起来像一个异步问题...... ???