std::vector<std::array<double,10>>的零初始化
考虑以下代码
std::vector<std::array<double,10>> a(10);
如果我正确理解标准a将不会被零初始化,因为 std::vector 构造函数上的 en.cppreference.com 说
- 使用 count 个默认插入的 T 实例构造容器。不制作副本。
所以因为默认初始化std::array<double, 10>不会用零填充它,a也不会包含零。
这是真的?
如何强制执行零初始化?
会a.data()指向100个连续double值吗?
编辑:
这是godbolt在gcc 10.2上使用-O2的输出
main:
mov edi, 800
sub rsp, 8
call operator new(unsigned long)
mov rdi, rax
lea rdx, [rax+800]
.L2:
mov QWORD PTR [rax], 0x000000000
add rax, 80
mov QWORD PTR [rax-72], 0x000000000
mov QWORD PTR [rax-64], 0x000000000
mov QWORD PTR [rax-56], 0x000000000
mov QWORD PTR [rax-48], 0x000000000
mov QWORD PTR [rax-40], 0x000000000
mov QWORD PTR [rax-32], 0x000000000
mov QWORD PTR [rax-24], 0x000000000
mov QWORD PTR [rax-16], 0x000000000
mov QWORD PTR [rax-8], 0x000000000
cmp rdx, rax
jne .L2
mov esi, 800
call operator delete(void*, unsigned long)
xor eax, eax
add rsp, 8
ret
所以它似乎是零初始化。那么问题仍然是为什么。
回答
重载将默认插入元素是正确的。
但是您必须继续阅读,因为默认插入意味着插入的值将被初始化,并且值初始化聚合(如std::array)将对聚合中的所有元素进行值初始化。
并且值的值初始化double将与零初始化相同。
因此,向量的每个数组中的所有元素都将初始化为零。
THE END
二维码