为了账号安全,请及时绑定邮箱和手机立即绑定

函数级静态变量何时分配/初始化?

函数级静态变量何时分配/初始化?

C++
aluckdog 2019-11-26 12:46:35
我非常有信心在程序启动时分配(并初始化,如果适用)全局声明的变量。int globalgarbage;unsigned int anumber = 42;但是在函数中定义的静态变量呢?void doSomething(){  static bool globalish = true;  // ...}什么时候globalish分配空间?我猜该程序何时启动。但是它也会被初始化吗?还是在doSomething()首次调用时初始化?
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

C ++标准的一些相关词汇:


3.6.2初始化非本地对象[basic.start.init]

1个

具有静态存储持续时间(basic.stc.static)的对象的存储应在进行任何其他初始化之前进行零初始化(dcl.init)。具有静态存储持续时间的POD类型(basic.types)的对象(使用常量表达式(expr.const)初始化)必须在进行任何动态初始化之前进行初始化。在同一翻译单元中定义并动态初始化且具有静态存储持续时间的名称空间范围的对象,应按照其定义在翻译单元中出现的顺序进行初始化。[注意: dcl.init.aggr 描述聚合成员的初始化顺序。本地静态对象的初始化在stmt.dcl中描述。]


[下面的更多文字为编译器作者增加了更多自由]


6.7声明声明[stmt.dcl]

...


4

在进行任何其他初始化之前,将对所有具有静态存储持续时间(basic.stc.static)的本地对象执行零初始化(dcl.init)。具有POD类型(basic.types)且具有静态存储持续时间的本地对象已通过常量表达式初始化,该对象在首次进入其块之前被初始化。在相同的条件下,允许实现对具有静态存储持续时间的其他本地对象执行早期初始化,而在相同的条件下,允许实现对名称空间范围内的具有静态存储持续时间的对象进行静态初始化(basic.start.init)。否则,将在控件第一次通过其声明时初始化此类对象。这样的对象在其初始化完成时被视为已初始化。如果初始化由于抛出异常而退出,则说明初始化未完成,因此下次控件进入声明时会再次尝试初始化。如果控件在初始化对象时(递归)重新输入声明,则该行为未定义。[ 示例:


      int foo(int i)

      {

          static int s = foo(2*i);  // recursive call - undefined

          return i+1;

      }

- 结束示例 ]


5

当且仅当构造变量时,才会执行具有静态存储持续时间的本地对象的析构函数。[注意: basic.start.term 描述具有静态存储持续时间的本地对象的销毁顺序。]


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 480 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信