首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::vector<std::array<double,10>>的零初始化

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

Stack Overflow用户
提问于 2021-03-30 17:20:26
回答 3查看 554关注 0票数 1

考虑以下代码

代码语言:javascript
复制
std::vector<std::array<double,10>> a(10);

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

  1. 构造带有计数默认插入的T实例的容器,不创建副本。

因此,因为默认初始化std::array<double, 10>不会用零填充它,所以a也不会包含零。

这是真的吗?

如何执行零初始化?

a.data()会指向100个连续的double值吗?

编辑:

这是来自-O2 gcc 10.2的哥德螺栓的输出。

代码语言:javascript
复制
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

所以它看起来是零初始化的。那么问题仍然是为什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-30 17:30:46

正确的是,重载将默认插入元素。

但是您必须继续阅读,因为默认插入意味着插入的值将是值初始化,值初始化聚合(如std::array)将值初始化聚合中的所有元素。

double值的值初始化将与零初始化相同。

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

票数 7
EN

Stack Overflow用户

发布于 2021-03-30 17:35:29

为了确保数组为零初始化,可以将1元素初始化程序列表作为第二个参数添加到a构造函数调用中:

代码语言:javascript
复制
std::vector<std::array<double, 10>> a(10, { 0.0, });

这将使用该列表初始化每个元素(数组),因为它将使用在这里描述的构造函数#3版本。

用于初始化每个数组的“值”参数将使用聚合初始化(请看这里),这将对列表中的任何“缺失”值进行零初始化。

票数 1
EN

Stack Overflow用户

发布于 2021-03-30 17:33:24

您可以这样做,如下面的演示程序所示:

代码语言:javascript
复制
#include <iostream>
#include <array>
#include <vector>

int main() 
{
    std::vector<std::array<double,10>> v(10, { {} } );
    
    for ( const auto &a : v )
    {
        for ( const auto &item : a )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }
    
    
    return 0;
}

程序输出是

代码语言:javascript
复制
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66875565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档