在这个话题中,他们说零初始化不是静态初始化。
有人能解释一下为什么吗?
3.6.2/2说:
有人能解释一下为什么吗?
3.6.2/2说:
这是静态初始化的定义,意味着零初始化是静态初始化,常量初始化也是静态初始化。零初始化和常量初始化一起被称为静态初始化;
这是静态初始化的定义,意味着零初始化是静态初始化,常量初始化也是静态初始化。零初始化和常量初始化一起被称为静态初始化;
零初始化适用于存储在.bss
中的所有变量,常量初始化适用于存储在.data
中的所有变量。(根据您的系统是基于RAM还是具有真正的ROM,也许常量初始化也适用于.rodata
)。
总体而言,所有这些都称为静态初始化,因为它适用于具有静态存储期的对象。
.data
段中;具有动态初始化器的数据通常位于.bss
段中。在我所使用的编译器中,具有常量初始化的const
对象位于.text
段中。 - James Kanze.rodata
和 .text
的使用并不一致。.text
通常包含实际的可执行代码,所以我猜这取决于编译器是否将常量与代码放在一起。也许我太习惯于使用嵌入式系统了,在这种情况下总是有真正的 ROM 存储器可用:在这种情况下,将常量存储在自己的段中,与代码分开存储更有意义。 - Lundin这只是词汇问题。初始化有明显的三个阶段(对于具有静态生命周期的变量):零初始化、使用常量表达式进行初始化和动态初始化。当讨论此时,我发现使用术语“静态初始化”来表示第二步很方便(因为它确实在静态情况下进行,不需要执行任何用户编写的代码),即使标准使用了稍微不同的术语。最终,归根结底,它都是一样的:
int a;
int b = 42;
int c = someFunction();
正式地说,这三个变量都将被初始化为零。然后,b
将被初始化为常量表达式 42
;很可能它永远不会被零初始化,因为在常量初始化之前,你的代码根本无法看到它。最后,c
将通过调用 someFunction()
进行初始化。
无论定义的顺序如何,这个顺序都是正确的,并且由标准保证。
你忘记在这个句子中加上“Together”这个词了,它非常重要。
零初始化 + 常量初始化 = 静态初始化。这样更清晰吗?
你链接的帖子说,零初始化不是静态初始化。这是正确的。
这与零初始化不是一种静态初始化非常不同!这是不正确的。
auto i = int();
,或者包含内置类型的聚合体的任何值初始化。 - juanchopanza