繁体   English   中英

C ++中结构的存储期限和成员初始化

[英]Storage Duration and Member Initialization of a Struct in C++

#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;
}

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 (零也可以是不确定的值)。 我还进行了其他更复杂的实验,将嵌套的struct和默认初始化放在// Some Other Code 有时我得到随机值,而其他时候(不是可忽略的数量)我得到零。

  • 结构A的存储期限是多少? 而对象a1a2的对象呢? 而变量a1.xa2.x呢?

  • 应将a1.xa2.x初始化为零? 还是它们不确定价值?

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

  • // Some Other Code的代码有什么区别吗? 例如,如果类T“具有带有默认初始值设定项的非静态成员”(例如在struct A { int b = 1; int x; }; ),则默认构造函数将不简单(即无法执行任何操作) 。 非平凡的构造函数还会初始化x吗? 普通的默认构造函数

有趣的链接:

C ++结构初始化

在结构中初始化默认值

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

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

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

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

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

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

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

这无关紧要。

...位于全局名称空间以及a1声明中

a1具有静态存储持续时间,并且已初始化为零。

a2声明处于块范围内

a2是非静态块局部变量。 它具有自动存储期限,并且默认情况下已初始化。 它具有不确定的值。


结构A的存储期限是多少?

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

...以及对象a1a2的对象?

往上看。

..和变量a1.xa2.x的变量?

子对象(包括非静态数据成员)继承其超对象的生存期。

...将a1.xa2.x初始化为零? 还是它们不确定价值?

a1初始化为零。 这包括其子对象。 a2不是。 这包括其子对象。

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

对于存储类,相同的规则集适用于联合和非联合类的对象以及非类类型的对象。 默认初始化对不同类型的含义有所不同。

//其他代码中的代码有什么区别吗? 例如,如果类T的构造函数“具有带有默认初始值设定项的非静态成员”,则默认构造函数将不容易(即不执行任何操作)。

编译器默认生成的非平凡默认构造函数将初始化没有默认初始化程序的成员。

结构A的存储期限是多少?

这个问题没有意义,存储取决于如何使用A


对象a1和a2的对象呢?

a1具有静态存储。 有关更多详细信息,请参见此问题。

a2具有自动存储功能。


而变量a1.x和a2.x呢?

它们的存储方式与其父A实例相同。


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

是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM