我有以下
char mem_pool[1024*1024*64];
int main() {
// ...
}
我正在尝试彻底理解如何初始化mem_pool
。经过大量的搜索,我的结论是:
static
关键字,而是“在程序运行之前 - 在静态初始化阶段”中运行)char ar[N]
一样)但是一组零。 如果我错了,有人可以帮助我消除语言所保证的内容并纠正我吗?
我还考虑过以下任何一种
char mem_pool[1024*1024*64] {};
char mem_pool[1024*1024*64] = "";
我怀疑这是一个更好/推荐的做法,但现在我需要了解我最初的问题。
答案 0 :(得分:5)
您的理解是正确的。
数组的元素都将被初始化为零,因为该数组具有静态存储持续时间:
[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
,则初始化不正确没有可访问的默认构造函数);- 如果{{1}}是数组类型,则每个元素都是默认初始化;
- 否则,不执行初始化。