【发布时间】:2021-06-26 17:49:49
【问题描述】:
考虑下面的代码
std::vector<std::array<double,10>> a(10);
如果我正确理解标准a 将不会被零初始化,因为
在 std::vector 构造函数上的 en.cppreference.com 说
- 使用默认插入的计数 T 实例构造容器。不制作副本。
因此,由于默认初始化 std::array<double, 10> 不会用零填充它,a 也不会包含零。
这是真的吗?
如何强制执行零初始化?
a.data() 会指向 100 个连续的double 值吗?
编辑:
这是在 gcc 10.2 上使用 -O2 时 Godbolt 的输出
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::vector<std::array<double,10>> a(10, {0});应该零初始化,我想。我相信,将a.data()视为 100 个双精度数组会表现出未定义的行为。 -
也许不是最方便的方法,但你不能只给出一个初始化列表作为向量构造函数的默认值吗?这样数组就会全部用它初始化:
std::vector<std::array<double,10>> a(10, {0,0,0,0,0,0,0,0,0,0});?
标签: c++ vector initialization stdarray