我的问题很简单,但答案可能不是。
在C++中(在Win7上使用Intel C++ 13.1编译器),全局静态变量是否总是在执行
如果它们在DLL中声明和定义,情况是否相同?
以下是一个案例:
我有这样的一些代码:
请注意,我省略了导出声明,但它已被正确导出。
从我的主应用程序代码来看,当我运行它时似乎并没有始终执行
如果您有任何想法或建议,将不胜感激。谢谢!
更新1
也许更容易告诉您我想要得到什么而不是我做了什么...
我想要一个变量,在 DLL 加载时自动实例化。该变量将由应用程序(.exe)中的单例注册(存储在 std::set 中的 ptr)。应用程序单例不知道 DLL,但 DLL 知道应用程序单例。因此,在 DLL 加载时,我希望该变量立即实例化,然后在应用程序单例中注册自己。这就是为什么我在 DLL 中声明了静态变量并在那里实例化它的原因。注册在 cTor 中完成。
我的最初问题是:静态实例化是否会在 DLL 加载时立即发生,或者可能会延迟?我之所以问这个问题是因为有时候我会观察到奇怪的行为,看起来像是异步问题...???
在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)中的单例注册(存储在 std::set 中的 ptr)。应用程序单例不知道 DLL,但 DLL 知道应用程序单例。因此,在 DLL 加载时,我希望该变量立即实例化,然后在应用程序单例中注册自己。这就是为什么我在 DLL 中声明了静态变量并在那里实例化它的原因。注册在 cTor 中完成。
我的最初问题是:静态实例化是否会在 DLL 加载时立即发生,或者可能会延迟?我之所以问这个问题是因为有时候我会观察到奇怪的行为,看起来像是异步问题...???
extern MyClass* sgMyClassPtr
而不是static *MyClass sgMyClassPtr
? - David