std::vector<std::array<double,10>>的零初始化

考虑以下代码

std::vector<std::array<double,10>> a(10);

如果我正确理解标准a将不会被零初始化,因为 std::vector 构造函数上的 en.cppreference.com 说

  1. 使用 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将与零初始化相同。

因此,向量的每个数组中的所有元素都将初始化为零。


以上是std::vector&lt;std::array&lt;double,10&gt;&gt;的零初始化的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>