为什么零初始化不是静态初始化
Why zero-initialization is not a static Initialization
在这个主题中,他们说零初始化不是静态初始化。
有谁能解释为什么吗?
3.6.2/2说:
同时调用零初始化和常量初始化静态初始化;
是静态初始化的定义,即0初始化为静态初始化,常数初始化为静态初始化
这个答案假设您知道静态存储时间的含义。
在c++ 03中指定为(3.6.2):
具有静态存储时间(3.7.1)的对象必须进行零初始化(8.5)在任何其他初始化发生之前。Zero-initialization和用常量表达式初始化的统称静态初始化;其他所有初始化都是动态的初始化。
在实践中,一个程序有不同的内存段来存储具有静态存储时间的变量:
- 一个段通常称为
.bss
,其中存储所有初始化为零的静态存储变量。 - 另一个段通常称为
.data
,其中存储所有显式初始化为值的静态存储变量。 - 进一步,有一个称为
.rodata
的段,其中存储所有const
变量。
(这是两个不同的部分的原因主要是程序启动性能,你可以在这里阅读更多信息)
0初始化适用于.bss
存储的所有变量,常数初始化适用于.data
存储的所有变量。(也许常数初始化也适用于.rodata
,这取决于您的系统是基于ram的还是具有真正的ROM)。
你忘了通知"Together"这个词,这个词在这句话中很重要。
零初始化+常量初始化=静态初始化。清楚了吗?
这只是词汇。显然有三个阶段初始化(对于具有静态生存期的变量):零初始化,使用常量表达式初始化,以及动态初始化。我觉得谈论的时候很方便这将在第二步中使用术语静态初始化(因为它是静态发生的,不需要执行任何用户编写的代码),即使标准使用了一些不同的术语。最后,一切都是一样的件事:
int a;
int b = 42;
int c = someFunction();
形式上,这三个变量都将被零初始化。然后b
将用常量表达式42
初始化;在很可能,它永远不会被零初始化,因为你的代码不可能在常数初始化。最后,c
将由呼叫someFunction()
无论定义的顺序如何,这个顺序都是正确的。
你链接到的文章说零初始化不是静态初始化。
那就是与非常不同——初始化不是,而是静态初始化!
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- "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成员初始化静态常量成员