静态变量会经历多次初始化吗?

sjs*_*sam 1 c++

考虑

//#include  stuff
const int x=5;
.
.
int main()
{
static int var=x; 
.
.
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,

  • 无论是否指示任何初始化,静态变量都是零初始化的,因此static int var;单独设置var为零并且static int var=x;也将首先设置var为初始化zero.
  • 现在进行static int var=x;一个常量表达式初始化,其中IIRC在零初始化之后完成.

是静态变量initialized multiple times- 尽管这个短语与自身矛盾吗?

Sam*_*hik 5

C++ 14指出:

3.6.2非局部变量的初始化

...

具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应在任何其他初始化发生之前进行零初始化(8.5).

好吧,这似乎是这个问题的基础.

执行常量初始化:

[...]

接下来是常量初始化的定义.为了使长话短说,无论是const int x=5;static int var=x;似乎满足不断初始化的要求.

因此,基于此,这似乎表明"静态变量[被多次初始化"].

开拓进取:

零初始化和常量初始化一起称为静态初始化; 所有其他初始化是动态初始化.在进行任何动态初始化之前,应执行静态初始化.

因此,零初始化和常量初始化,这里的主题"多个"初始化必须在动态初始化之前发生.

由此,我得出结论,虽然从技术上讲,"静态变量多次初始化"的说法是正确的,但我认为没有任何方法可以实际观察它.您需要动态初始化来观察某些事情.并且在静态初始化完成之前不会进行动态初始化.

从这一点来看,它看起来像3.6.2中定义的术语"静态初始化",与"静态初始化惨败"中的"静态初始化"并不完全相同.在我看来,"静态初始化惨败"应该被称为"动态初始化惨败".