全局静态变量实例化行为

global static variable instantiation behaviour

本文关键字:实例化 变量 静态 全局      更新时间:2023-10-16

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

在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 的链接器选项。