在this主题中,他们说零初始化不是静态初始化。
任何人都可以解释原因吗?
3.6.2 / 2说:
一起调用零初始化和常量初始化 静态初始化;
静态初始化的定义,意味着零初始化是静态初始化,常量初始化是静态初始化
答案 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 静态初始化!这是不正确的。