在this主题中,他们说零初始化不是静态初始化。
有人能解释原因吗?
3.6.2/2说:
零初始化和常量初始化共同称为静态初始化;
它是静态初始化的定义,意味着零初始化是静态初始化,常数初始化是静态初始化。
发布于 2014-07-01 14:29:18
这个答案假设您知道静态存储持续时间意味着什么。
在C++03中,这被指定为(3.6.2):
具有静态存储持续时间(3.7.1)的对象在进行任何其他初始化之前必须为零初始化(8.5)。零初始化和带有常量表达式的初始化统称为静态初始化;所有其他初始化都是动态初始化。
在实践中,程序有不同的内存段,其中存储具有静态存储持续时间的变量:
.bss
,其中所有初始化为零的静态存储变量都被存储。.data
,其中显式初始化为值的所有静态存储变量都被存储。.rodata
的段,其中存储了所有const
变量。(这两个不同部分的原因主要是程序启动性能,您可以阅读更多关于该here的内容。)
零初始化适用于存储在.bss
中的所有变量,常数初始化适用于存储在.data
中的所有变量。(也许持续的初始化也适用于.rodata
,这取决于您的系统是基于RAM的还是有真正的ROM)。
所有这些都被称为静态初始化,因为它适用于具有静态存储持续时间的对象。
发布于 2014-07-01 14:05:25
你忘了通知“一起”这个词,这句话很重要。
零初始化+常量初始化=静态初始化。这样更清楚吗?
发布于 2014-07-01 14:35:31
只是词汇而已。显然,初始化有三个阶段(对于具有静态生存期的变量):零初始化、使用常量表达式的初始化和动态初始化。在讨论这个问题时,我发现在第二步中使用静态初始化这个术语是很方便的(因为它确实是静态进行的,而不需要执行任何用户编写的代码),即使标准使用了一些不同的术语。最后,它归结为同样的事情:
int a;
int b = 42;
int c = someFunction();
形式上,这三个变量都将被初始化为零。然后,b
将使用常量表达式42
进行初始化;在所有类似的情况下,它永远不会实际为零初始化,因为在常量初始化之前,您的代码不可能看到它。最后,将通过调用c
来初始化someFunction()
。
不管定义的顺序如何,这个顺序都是真的,并由标准来保证。
https://stackoverflow.com/questions/24512191
复制相似问题