繁体   English   中英

该变量将如何初始化?

[英]How will this variable be initialized?

我有以下内容

char mem_pool[1024*1024*64]; 

int main() {
    // ... 
}

我想彻底了解 mem_pool如何初始化。 经过大量的搜索,我的结论是:

  • 它是一个静态初始化(不是static的关键字,而是“在程序之前运行 - 在静态初始化阶段”)
  • 它将分两个阶段运行:零初始化和默认初始化(第二阶段不会做任何事情)
  • 它是一个POD数组,因此应该应用每个元素的默认初始化,但是由于前两个点我们将不会有一个不确定值的数组(就像我们在函数范围中使用char ar[N] )但是零数组。

有人可以帮助我消除语言所保证的内容,如果我错了,还要纠正我吗?

我还想过做以下任何事情

char mem_pool[1024*1024*64] {}; 
char mem_pool[1024*1024*64] = ""; 

我怀疑这是一个更好/推荐的做法,但现在我需要了解我的初步问题。

你的理解是正确的。

数组的元素都将被初始化为零,因为该数组具有静态存储持续时间:

[C++11: 3.6.2/2]: 在进行任何其他初始化之前,具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应进行零初始化 (8.5)。 [..]

[C++11: 8.5/5]: 零初始化 T类型的对象或引用意味着:

  • 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T ;
  • 如果T是(可能是cv限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的,并且填充初始化为零位;
  • 如果T是(可能是cv限定的)联合类型,则对象的第一个非静态命名数据成员被零初始化,并且填充被初始化为零位;
  • 如果T是数组类型,则每个元素都是零初始化的 ;
  • 如果T是引用类型,则不执行初始化。

如果它没有静态存储持续时间,则元素都将具有不确定的值:

[C++11: 8.5/11]: 如果没有为对象指定初始值设定项,则默认初始化该对象 ; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。 [..]

[C++11: 8.5/6]: 默认初始化类型为T的对象意味着:

  • 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
  • 如果T是数组类型,则每个元素都是默认初始化的 ;
  • 否则,不执行初始化

暂无
暂无

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

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