c++ - 为什么零初始化不是静态初始化

标签 c++ initialization

this topic 他们说零初始化不是静态初始化。

谁能解释一下为什么?

3.6.2/2 说:

Together, zero-initialization and constant initialization are called static initialization;

是静态初始化的定义,即零初始化是静态初始化,常量初始化是静态初始化

最佳答案

此答案假定您知道静态存储持续时间 的含义。

在 C++03 中,这被指定为 (3.6.2):

Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization.

在实践中,一个程序有不同的内存段,它存储具有静态存储持续时间的变量:

  • 一段通常称为.bss,其中存储所有初始化为零的静态存储变量。
  • 另一个段通常称为.data,其中存储所有显式初始化为值的静态存储变量。
  • 此外,还有一个名为 .rodata 的段,其中存储了所有 const 变量。

(这两个不同的段的原因主要是程序启动性能,你可以阅读更多关于here的内容。)

零初始化适用于存储在.bss 中的所有变量,常量初始化适用于存储在.data 中的所有变量。 (也许常量初始化也适用于 .rodata,这取决于您的系统是基于 RAM 还是具有真正的 ROM)。

总的来说,所有这些都称为静态初始化,因为它适用于具有静态存储持续时间的对象。

关于c++ - 为什么零初始化不是静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512191/

相关文章:

c++ - ThreadId 在 CreateThread() c++ 中的重要性

c++ - 我必须将哪些参数传递给函数才能执行对象的隐式构造?

java - C++/JNI - 如何访问在 JAVA (Android NDK) 中的 .h 中声明的枚举

c++ - initializer_list 结合其他参数

java - 变量可以在循环中分配吗?

c++ - 错误 C1903 - 调用 offsetof 时无法从以前的错误中恢复

c++ - 如果找到,则尝试输出所有索引值

iphone - 关于覆盖 init 函数的几个问题

C++ 使用值初始化聚合类型的 std::array

java - 用java智能创建对象