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

时间:2016-07-15 02:29:39

标签: c++

考虑

//#include  stuff
const int x=5;
.
.
int main()
{
static int var=x; 
.
.
}

如果我理解正确,

  • 静态变量是零初始化的,无论是否指示任何初始化,因此static int var;单独将var设置为零,static int var=x;也将var设置为{{ 1}}起初。
  • 现在zero执行一个常量表达式初始化,在零初始化之后完成IIRC。

静态变量static int var=x; - 虽然这句话自相矛盾吗?

1 个答案:

答案 0 :(得分: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中定义的术语“静态初始化”,与“静态初始化惨败”中的“静态初始化”并不完全相同。在我看来,“静态初始化惨败”应该被称为“动态初始化惨败”。