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

Why zero-initialization is not a static Initialization

本文关键字:初始化 静态 为什么      更新时间:2023-10-16

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

有谁能解释为什么吗?

3.6.2/2说:

同时调用零初始化和常量初始化静态初始化;

是静态初始化的定义,即0初始化为静态初始化,常数初始化为静态初始化

这个答案假设您知道静态存储时间的含义。

在c++ 03中指定为(3.6.2):

具有静态存储时间(3.7.1)的

对象必须进行零初始化(8.5)在任何其他初始化发生之前。Zero-initialization和用常量表达式初始化的统称静态初始化;其他所有初始化都是动态的初始化。

在实践中,一个程序有不同的内存段来存储具有静态存储时间的变量:

  • 一个段通常称为.bss,其中存储所有初始化为零的静态存储变量。
  • 另一个段通常称为.data,其中存储所有显式初始化为值的静态存储变量。
  • 进一步,有一个称为.rodata的段,其中存储所有const变量。

(这是两个不同的部分的原因主要是程序启动性能,你可以在这里阅读更多信息)

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

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

你忘了通知"Together"这个词,这个词在这句话中很重要。

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

这只是词汇。显然有三个阶段初始化(对于具有静态生存期的变量):零初始化,使用常量表达式初始化,以及动态初始化。我觉得谈论的时候很方便这将在第二步中使用术语静态初始化(因为它是静态发生的,不需要执行任何用户编写的代码),即使标准使用了一些不同的术语。最后,一切都是一样的件事:

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

形式上,这三个变量都将被零初始化。然后b将用常量表达式42初始化;在很可能,它永远不会被零初始化,因为你的代码不可能在常数初始化。最后,c将由呼叫someFunction()

无论定义的顺序如何,这个顺序都是正确的。

你链接到的文章说零初始化不是静态初始化

那就是非常不同——初始化不是,而是静态初始化!