首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么零初始化不是静态初始化?

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

Stack Overflow用户
提问于 2014-07-01 14:00:32
回答 4查看 185关注 0票数 3

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

有人能解释原因吗?

3.6.2/2说:

零初始化和常量初始化共同称为静态初始化;

它是静态初始化的定义,意味着零初始化是静态初始化,常数初始化是静态初始化。

EN

回答 4

Stack Overflow用户

发布于 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)。

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

票数 1
EN

Stack Overflow用户

发布于 2014-07-01 14:05:25

你忘了通知“一起”这个词,这句话很重要。

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-01 14:35:31

只是词汇而已。显然,初始化有三个阶段(对于具有静态生存期的变量):零初始化、使用常量表达式的初始化和动态初始化。在讨论这个问题时,我发现在第二步中使用静态初始化这个术语是很方便的(因为它确实是静态进行的,而不需要执行任何用户编写的代码),即使标准使用了一些不同的术语。最后,它归结为同样的事情:

代码语言:javascript
运行
复制
int a;
int b = 42;
int c = someFunction();

形式上,这三个变量都将被初始化为零。然后,b将使用常量表达式42进行初始化;在所有类似的情况下,它永远不会实际为零初始化,因为在常量初始化之前,您的代码不可能看到它。最后,将通过调用c来初始化someFunction()

不管定义的顺序如何,这个顺序都是真的,并由标准来保证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24512191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档