全局静态变量实例化行为
global static variable instantiation behaviour
我的问题很简单,也许答案不是。
在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 静态并在那里实例化它。注册在 cTor 中完成。
我最初的问题是:静态实例化是在 DLL 加载时发生还是可能会延迟?我问这个问题是因为有时我观察到奇怪的行为,它看起来像一个异步问题...... ???
加载 DLL 时会发生静态初始化,但根据链接器选项,可以按需加载 DLL。请注意,如果同时在 DLL 和主程序中都包含该类,但未将其从 DLL 导出,则将获得代码的两个副本,并可能获得(类)静态变量的两个副本。因此,您可能会对一个副本没有初始化而另一个副本实际上已经初始化感到困惑。
但请确保首先了解有关延迟加载 DLL 的链接器选项。
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 是否可以将指向未实例化的对象的指针用作C++中的变量?
- 类外的静态变量实例化
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- 使用动态布尔变量实例化模板
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 如何在实例化类类型的变量时打印其名称
- 实例化变量,但没有可用的定义
- 访问实例化类的变量/函数
- 如何从类内实例化的对象访问私有变量
- C++ 变量未正确实例化
- 全局变量的 C++ 后期实例化
- 类成员的C++静态成员变量实例化了两次
- 是否为类的每个实例实例化了私有类变量
- 由类中未实例化的静态成员变量引起的未定义引用C++
- 在C++中实例化带大括号与不带大括号的变量有什么区别?
- 实例化变量的 V8 顺序(多线程)
- 实例化变量的新实例
- 在数学表达式中实例化变量
- 如何在Qt中声明和实例化变量