静态初始化和动态初始化

Example Static and Dynamic Initialization

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

是否存在静态和动态两种方式初始化变量的例子?如规范所述。

静态初始化应在任何动态初始化之前执行初始化开始。

我假设变量可以在同一个程序中以静态和动态方式初始化。尽管我认为,那个初始化是一个初值的定义。

当然:静态初始化将在任何用户代码运行之前用零填充所有对象。

这些零可能在执行其他初始化式时可见。阅读"静态初始化顺序失败"

注意,在动态初始化完成之前,对象不会被认为是构造的,并且必须遵循生命周期规则。标准中的[basic.life]规定:

对象的生存期是该对象的运行时属性。如果对象是类类型或聚合类型,并且它或它的一个成员是由普通默认构造函数以外的构造函数初始化的,则该对象被称为具有非平凡初始化。[注:普通复制/移动构造函数的初始化是非普通初始化。]T类型对象的生存期从以下时刻开始:

    获得了适合T类型的正确对齐和大小的
  • 存储器,并且
  • 如果对象具有非平凡初始化,则表示该对象初始化完成。

本国际标准中赋予对象的属性仅在给定对象的生命周期内适用。[注意:特别是在对象生命周期开始之前和结束之后,对象的使用有明显的限制,如下12.6.2和12.7所述。]此外,正在构造和销毁的对象的行为可能与生命周期已经开始但尚未结束的对象的行为不同。12.6.2和12.7描述了对象在构造和销毁阶段的行为。

同样,在对象的生命周期开始之前,在对象将占用的存储空间被分配之后,或者在对象的生命周期结束之后,在对象所占用的存储空间被重用或释放之前,任何指向原始对象的glvalue都可以被使用,但只能以有限的方式使用。对于正在构建或销毁的对象,请参见12.7。否则,这样的glvalue指的是已分配的存储(3.7.4.2),并且使用不依赖于其值的glvalue属性是定义良好的。如果:

程序有未定义的行为
  • 左值到右值的转换(4.1)应用于这样的glvalue,
  • glvalue用于访问非静态数据成员或调用对象的非静态成员函数,或者
  • glvalue绑定到虚基类(8.5.3)的引用,或者
  • glvalue用作dynamic_cast(5.2.7)的操作数或typeid的操作数。

因此,访问非基本类型对象的(归零)内容很容易导致未定义的行为。