【发布时间】:2015-10-17 23:21:33
【问题描述】:
我最近痛苦地意识到Static Initialization Order Fiasco。我想知道“跨翻译单元未定义初始化顺序”的规则是否仍然适用于父类中的静态成员,而子类中的静态成员需要这些静态成员。
例如,假设我们有(为简洁起见,排除所有#个守卫和包含)
// a.h
class A {
static int count;
static int register_subclass();
};
// a.cpp
int A::count = 0;
int A::register_subclass() {
return count ++;
}
然后是A的子类,
// b.h
class B : public A {
static int id;
};
// b.cpp
int B::id = A::register_subclass();
这里有两个翻译单元,其中一个是静态对象,一个取决于另一个初始化时的静态对象……看起来它可能是静态初始化顺序惨败的一个实例。
我的问题是:它真的安全吗?
也就是说,我是否保证B::id 不会在A::count 初始化之前包含从A::count 复制的垃圾?从我自己的测试来看,A 似乎总是首先被初始化,但我不确定如何在初始化顺序中引入噪音以增加如果行为未定义的失败概率。
【问题讨论】:
-
没有。 a.cpp 和 b.cpp 链接到可执行文件的顺序是不保证的。那就是的“初始化顺序惨败”。 (您的链接器可能使用字母顺序,也可能不使用)。
-
@BoPersson 我很害怕。谢谢。将此作为答案(也许提供参考?),我会将其标记为已接受
-
@BoPersson:答案去那里哥们↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
标签: c++ initialization static-initialization initialization-order