C++中静态成员变量w按标准是否应当执行动态初始化?
结论
你的理解完全正确,符合C++标准的规定,原问题的采纳答案确实存在错误。
规则拆解
- 具有静态存储周期的非局部变量初始化分为两个阶段:先执行静态初始化(程序加载阶段完成,无需运行时代码执行),再执行动态初始化(main函数启动前的运行时阶段执行)。
- 标准允许实现对原本需要动态初始化的变量做静态初始化优化,核心前提是:静态初始化得到的变量值,和按规则动态初始化得到的变量值完全一致。
即使具有静态存储周期的非局部变量不要求被静态初始化,实现也被允许将其作为静态初始化执行,前提是……如果所有不要求静态初始化的变量都被动态初始化,那么静态版本的初始化在被初始化变量中产生的值与动态初始化产生的值相同。
场景分析
你给出的代码场景中:
- 编译
MyOtherClass.cpp翻译单元时,编译器仅能看到MyClass::z的声明,看不到位于MyClass.cpp翻译单元中的MyClass::z = 4初始化定义,根本无法确定MyClass::z最终的初始化值,自然无法满足「静态初始化结果和动态初始化结果一致」的前提条件。 - 这种情况下编译器没有权限做静态初始化优化,
MyOtherClass::w必须按照标准要求进行动态初始化。
特殊说明
如果编译时开启了全程序优化(LTO/IPO),链接阶段可以读取所有翻译单元的内容,此时链接器可以确认MyClass::z的最终值为4,这种场景下将w优化为静态初始化是符合标准要求的,属于允许的优化行为。
内容的提问来源于stack exchange,提问作者Oleksa
相关产品推荐
相关产品推荐

