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

时间:2017-01-11 16:36:39

标签: 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;
}

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中。有时我得到随机值和其他时间(不是可忽略不计的数字)我得到零。

  • Struct A的存储持续时间是多少?对象a1a2的对象是什么?变量a1.xa2.x

  • Shoud a1.xa2.x是否已初始化为零?或者他们是不确定的价值观?

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

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

有趣的链接:

C++ Structure Initialization

Initializing default values in a struct

Are members of a C++ struct initialized to 0 by default?

Default initialization of POD types in C++

Initialization of Objects with Static Storage Duration in C vs C++

C and C++ : Partial initialization of automatic structure

How to initialize structures to all-elements-zero-or-null

2 个答案:

答案 0 :(得分:4)

  

a1是否具有静态存储持续时间并且a2具有自动存储持续时间?

     

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

这是无关紧要的。

  

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

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

  

a2声明在块范围内

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

  

Struct A的存储持续时间是什么?

类型没有存储持续时间。对象有。

  

......对象a1a2

见上文。

  

..变量a1.xa2.x

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

  

... Shoud a1.xa2.x是否已初始化为零?或者他们是不确定的价值观?

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

  

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

当涉及到存储类时,同一组规则适用于union和non-union类的对象以及非类类型。默认初始化对于不同类型的含义有所不同。

  

//其他代码中的代码有什么不同吗?例如,如果T&#34;类的构造函数具有带有默认初始值的非静态成员&#34;那么默认构造函数不能是微不足道的(即不执行任何操作)。

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

答案 1 :(得分:2)

  

结构A的存储持续时间是多少?

这个问题没有意义,存储取决于A的使用方式。

  

对象a1和a2的那个?

a1有静态存储空间。 See this question for more details.

a2具有自动存储功能。

  

变量a1.x和a2.x?

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

  

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