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

Explicit static initialization to zero in C++

本文关键字:初始化 静态 C++      更新时间:2023-10-16

很抱歉问这个琐碎的问题,但我找不到明确的答案:如果我有显式的静态初始化到零,是零初始化还是用常量表达式初始化?假设我有

a.hpp:

class A { ... static int x; }

a.cpp;

int A::x = 0;

0将被分配给x多少次?在零初始化期间一次,还是在零初始化和使用常量表达式初始化期间两次?

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

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

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