为什么零初始化不是静态初始化

时间:2014-07-01 14:00:32

标签: c++ initialization

this主题中,他们说零初始化不是静态初始化。

任何人都可以解释原因吗?

3.6.2 / 2说:

  

一起调用零初始化和常量初始化   静态初始化;

静态初始化的定义,意味着零初始化是静态初始化,常量初始化是静态初始化

4 个答案:

答案 0 :(得分:1)

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

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

  

具有静态存储持续时间(3.7.1)的对象应进行零初始化   (8.5)在进行任何其他初始化之前。零初始化   并且统一调用具有常量表达式的初始化   静态初始化;所有其他初始化是动态的   初始化。

实际上,程序具有不同的内存段,用于存储具有静态存储持续时间的变量:

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

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

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

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

答案 1 :(得分:0)

你忘了通知单词“Together”,这句话非常重要。

零初始化+常量初始化=静态初始化。那更清楚吗?

答案 2 :(得分:0)

这只是词汇量。显然有三个阶段 初始化(对于具有静态生命周期的变量):零 初始化,使用常量表达式初始化,和 动态初始化。谈到时我觉得很方便 这是第二步使用术语静态初始化 (因为它确实是静态发生的,没有执行 任何用户编写的代码),即使标准使用了一些 不同的术语。最后,它归结为相同 事情:

int a;
int b = 42;
int c = someFunction();

正式地,所有三个变量都将进行零初始化。然后 b将使用常量表达式42进行初始化;在 所有可能性,它永远不会被零初始化, 因为你的代码无法在之前看到它 不断初始化。最后,c将被初始化 致电someFunction()

无论定义的顺序如何,此顺序均为真, 并且由标准保证。

答案 3 :(得分:-2)

您链接的帖子表示零初始化不是静态初始化。这是正确的。

非常零初始化不同 a 静态初始化!这是不正确的。