在C++中显式静态初始化为零
Explicit static initialization to zero in C++
很抱歉问这个琐碎的问题,但我找不到明确的答案:如果我有显式的静态初始化到零,是零初始化还是用常量表达式初始化?假设我有
a.hpp:
class A { ... static int x; }
a.cpp;
int A::x = 0;
0将被分配给x
多少次?在零初始化期间一次,还是在零初始化和使用常量表达式初始化期间两次?
在执行任何代码之前,变量的值将为0。它是如何做到这一点的,很大程度上取决于系统;一种典型的方法是在加载程序时从磁盘读取日期的图像。形式上,您有零初始化,然后是静态初始化,但没有一个一致的实现可以判断,我从来没有听说过将两者分开的实现。
在Unix下,至少在它的旧版本和更传统的版本中,未初始化的静态变量被放置在bs段中,数据段中静态初始化的变量。可执行文件磁盘上的文件包含数据段的映像复制到内存中;bs段中的所有字节都设置为0。在一台具有分页虚拟内存的现代机器上,我希望类似行为,不同之处在于初始化被推迟到该页面首次被访问。
如果Windows以不同的方式处理(除了段的名称),我会感到非常惊讶。
相关文章:
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- "local scope"中的 C++ 初始化静态变量
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- 如何从静态类函数初始化静态类对象
- C++:用IIFE线程初始化静态局部变量安全吗
- 如何在 c++ 中初始化静态类对象?
- 使用 lambda 初始化静态数组
- 使用 lambda 函数初始化静态数据成员
- 如何从 std::integer_sequence 初始化静态数组?
- 在构造函数中初始化静态函数指针
- C - 初始化静态成员的方法
- 大括号使用枚举类初始化静态常量unordered_map
- C++ main 函数中初始化静态变量
- 在定义(.cpp文件)中初始化静态浮点 constexpr 成员是可能的
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 如何在运行时使用静态成员函数初始化静态成员变量
- 与其他静态const成员初始化静态常量成员