在C ++中显式静态初始化为零

时间:2012-01-10 13:18:31

标签: c++ initialization

我很遗憾地提出这个微不足道的问题,但我找不到一个明确的答案:如果我有明确的静态初始化为零,是初始化为零还是使用常量表达式进行初始化?如果我有话说

a.hpp:

class A { ... static int x; }

a.cpp;

int A::x = 0;

0 x分配多少次?一次零初始化期间或两次零初始化和初始化期间用常量表达式?

1 个答案:

答案 0 :(得分:2)

在执行任何代码之前,变量的值将为0。 如何通过这种方式在很大程度上取决于系统;一种典型的方法 是在加载程序时从磁盘读取日期的图像。 在形式上,初始化为零,然后是静态 初始化,但是一致的实现无法说明, 我从来没有听说过将两者分开的实现。

在Unix下,至少在旧的和更传统的版本中, 未初始化的静态变量放在bs段中, 数据段中的静态初始化变量。可执行文件 磁盘上的文件包含数据段的图像,即 复制到记忆中; bs段中的所有字节都设置为0。 在具有分页虚拟内存的现代机器上,我期望类似 行为,区别在于初始化被推迟到 该页面首次被访问。

如果Windows以不同的方式处理(除了段的名称),我会非常惊讶。