C++静态简单类型是按顺序初始化的吗?

Mat*_*hew 3 c++ static types

我的经验告诉我,给定一个对象:

class Object
{
private:
    static int array[];

public:
    Object(int id);
};


int Object::array[] = { 2937, 892 };


Object::Object(int id)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

初始化array将在调用任何方法之前Object或在程序中的任何其他对象上调用任何方法,无论是否声明对象static.

基本上,我要问的是,有人不同意静态简单C类型(非对象),如char,shortint,以及long(没有构造函数由这些类型构成的结构)在可执行文件加载到内存中时,在main()之前被初始化或者调用任何其他构造函数?

mik*_*ked 7

是的,所有静态初始化都在调用main()之前发生.但是你无法确定初始化发生的顺序.当一个静态变量依赖于另一个静态变量的存在时,这可能会造成严重破坏.它被称为静态初始化惨败:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14

我经常使用faq中提到的解决方案.使用内部带有静态变量的函数可以更好地控制顺序.


Mic*_*urr 7

我认为您正在谈论的特定类型的初始化:

基本上,我要问的是,是否有人不同意将可执行文件加载到内存中时初始化静态简单C类型(非对象),如char,short,int和long(以及没有由这些类型组成的构造函数的结构),在调用main()或任何其他构造函数之前?

我假设你的意思是用常量初始化 - 而不是通过调用函数.如果该假设是正确的,则可以确定在调用任何构造函数之前初始化将会发生:

  • 3.6.2非本地对象的初始化

具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).使用常量表达式进行零初始化和初始化统称为静态初始化; 所有其他初始化是动态初始化.具有使用常量表达式(5.19)初始化的静态存储持续时间的POD类型(3.9)的对象应在任何动态初始化发生之前初始化. 在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化.

然而如初始化如

static int x = getvalue();
Run Code Online (Sandbox Code Playgroud)

落入动态初始化类别,因此它按外观排序(并且在不同的翻译单元之间不确定).

另一个警告是,这不适用于局部静态(在输入块之前可能不会初始化),但这确实无关紧要,因为无论如何都要输入封闭块之前它们无法访问.