C++ 结构体的存储持续时间和成员初始化

J L*_*J L 3 c++ struct initialization member storage-duration

#include <iostream>

using namespace std;

struct A {
    // Some Other Code
    int x;
};

A a1;

int main(){
    A a2;
    cout << "a1.x = " << a1.x << endl;
    cout << "a2.x = " << a2.x << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++14 标准 (ISO/IEC 14882:2014) 第 8.5 节,第 12 段:

如果没有为对象指定初始化程序,则该对象是默认初始化的。当获得具有自动或动态存储期限的对象的存储时,该对象具有不确定值,如果没有对该对象执行初始化,则该对象保留一个不确定值,直到该值被替换(5.17)。[注意:具有静态或线程存储持续时间的对象是零初始化的,参见 3.6.2。- 尾注]

那么a1有静态存储持续时间和a2自动存储持续时间吗?的定义Struct A在全局命名空间以及a1声明中,而a2声明在块范围内(在main()函数内部)。

此外,第 3.6.2 节说:

第 1 段:

作为程序启动的结果,具有静态存储持续时间的非局部变量被初始化。

第 2 段:

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

此外,使用 gcc 5.4.0 我得到一个警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]) 和一个随机值,但使用 clang 3.8.0 输出总是a2.x = 0(零也可以是不确定的值)。我还进行了其他更复杂的实验,将嵌套structs 和默认初始化放在// Some Other Code. 有时我会得到随机值,而其他时候(不是可以忽略的数量)我会得到零。

  • 什么是 Struct 的存储期限A?和对象a1a2?而变量a1.xa2.x

  • 应该a1.x并被a2.x零初始化?或者它们是不确定的值?

  • 同样的规则适用于classunion吗?

  • 中的代码有// Some Other Code什么不同吗?例如,如果类 T“具有带有默认初始值设定项的非静态成员”(如 in struct A { int b = 1; int x; };),则默认构造函数不能是微不足道的(即不能执行任何操作)。那个非平凡的构造函数也会初始化x吗?平凡的默认构造函数

有趣的链接:

C++ 结构初始化

在结构中初始化默认值

默认情况下,C++ 结构的成员是否初始化为 0?

C++中POD类型的默认初始化

在 C 与 C++ 中初始化具有静态存储持续时间的对象

C和C++:自动结构的部分初始化

如何将结构初始化为全元素零或空

eer*_*ika 5

那么 a1 是否具有静态存储持续时间,而 a2 是否具有自动存储持续时间?

Struct 的定义A在全局命名空间...

这无关紧要。

...位于全局命名空间,以及a1声明

a1 具有静态存储持续时间并且它是零初始化的。

whilea2声明在块范围内

a2是一个非静态块局部变量。它具有自动存储持续时间,并且默认初始化。它有一个不确定的值。


什么是 Struct 的存储期限A

类型没有存储期限。对象做。

... 那对象a1a2

看上面。

.. 变量a1.xa2.x

子对象,包括非静态数据成员,继承其超对象的生命周期。

... 768,16a1.xa2.x被零初始化?或者它们是不确定的值?

a1是零初始化。这包括它的子对象。a2不是。这包括它的子对象。

相同的规则适用于班级和工会吗?

当涉及到存储类时,相同的规则集适用于联合和非联合类的对象以及非类类型。对于不同类型,默认初始化的含义存在差异。

// Some Other Code 中的代码有什么不同吗?例如,如果类 T 的构造函数“具有带有默认初始值设定项的非静态成员”,则默认构造函数不能是微不足道的(即不执行任何操作)。

由编译器默认生成的非平凡默认构造函数初始化没有默认初始值设定项的成员。


归档时间:

查看次数:

820 次

最近记录:

8 年,9 月 前