C++规范中函数初始化静态全局变量中间值的相关咨询
C++静态变量初始化的规范说明
问题场景
给定如下代码:
static bool variable = Function();
1. Function()执行前variable的值与行为界定
根据C++标准,静态存储期变量的初始化分为两个阶段:
- 零初始化阶段:程序启动的早期阶段,所有静态存储期变量会被统一零初始化。对于
bool类型的variable,此时它的确定值是false。 - 动态初始化阶段:零初始化完成后,才会调用
Function()完成对variable的赋值。
需要注意:如果Function()内部尝试读取variable的值(也就是在动态初始化完成前访问该变量),这种行为的界定在标准中较为模糊——正如补充提到的观点:
"它最初会被零初始化,但读取这个零值是否属于未定义行为尚无明确结论"
单纯讨论Function()执行前的状态,variable是经过零初始化的,拥有确定的false值;但动态初始化过程中读取该变量的行为,目前没有明确的标准条款给出定论。
2. 未定义行为的修复与存储区域的影响
如果要让相关行为完全确定,可以通过以下方式规避:
- 使用函数内静态变量(即Meyers单例模式的思路):将依赖的变量封装在函数内部,第一次调用函数时才完成初始化,确保初始化顺序的确定性。
- 将关联的静态变量放在同一个编译单元内:利用C++标准中"同一编译单元内静态变量按声明顺序初始化"的规则,明确初始化顺序。
至于"告知编译器将variable存储在零初始化区域"的操作,不会改变最终结果——因为静态变量本来就会经历零初始化阶段,该操作只是明确了存储位置,但无法解决动态初始化顺序或初始化过程中读取变量的模糊行为问题。
内容的提问来源于stack exchange,提问作者Felipe Lavratti
相关产品推荐
相关产品推荐

