我很遗憾地提出这个微不足道的问题,但我找不到一个明确的答案:如果我有明确的静态初始化为零,是初始化为零还是使用常量表达式进行初始化?如果我有话说
a.hpp:
class A { ... static int x; }
a.cpp;
int A::x = 0;
0 x
分配多少次?一次零初始化期间或两次零初始化和初始化期间用常量表达式?
答案 0 :(得分:2)
在执行任何代码之前,变量的值将为0。 如何通过这种方式在很大程度上取决于系统;一种典型的方法 是在加载程序时从磁盘读取日期的图像。 在形式上,初始化为零,然后是静态 初始化,但是一致的实现无法说明, 我从来没有听说过将两者分开的实现。
在Unix下,至少在旧的和更传统的版本中, 未初始化的静态变量放在bs段中, 数据段中的静态初始化变量。可执行文件 磁盘上的文件包含数据段的图像,即 复制到记忆中; bs段中的所有字节都设置为0。 在具有分页虚拟内存的现代机器上,我期望类似 行为,区别在于初始化被推迟到 该页面首次被访问。
如果Windows以不同的方式处理(除了段的名称),我会非常惊讶。