【问题标题】:Why does std::vector zero initilize its memory?为什么 std::vector zero 初始化它的内存?
【发布时间】:2017-03-15 21:26:29
【问题描述】:

我最近注意到std::vector 在分配后确实用零清除了它的内存。

我之前创建过类似的容器(尽管不符合std),并且我不需要在创建新项目之前显式地将内存归零。

我找不到这样做的理由,我只是想知道为什么。

为了说明:

struct S {
    int s[128];
};

bool vector_zeroed() {
    std::vector<S> c;
    while(c.size() < 1000) {
        c.emplace_back();
    }

    bool zeroed = true;
    for(const auto& s : c) {
        for(int i : s.s) {
            zeroed &= i == 0;
         }
    }
    return zeroed;
}

bool array_zeroed() {
    bool zeroed = true;
    auto *s = new S[1000];
    for(int k = 0; k != 1000; ++k) {
        for(int i : s[k].s) {
            zeroed &= i == 0;
        }
    }
    delete[] s;
    return zeroed;
}

vector_zeroed() 似乎总是返回 truearray_zeroed() 返回 false

我显然在这里遗漏了一些东西,但我不知道是什么。

【问题讨论】:

  • 在发布模式下会发生这种情况吗?
  • 你是如何创建矢量的?如果你使用了reserve,它不应该将内存归零。
  • 请更加明确。您究竟注意到了什么?什么代码正是让你注意到了?我可以创建std::vectors 不将内存归零的情况。我可以创建std::vectors 执行零内存的情况。
  • @NathanOliver:如果你使用reserve,那么它不会在那里创建对象。它只是保留空间。他问的是如何在不初始化数据的情况下创建对象。
  • @NicolBolas:你不知道。事实上,他的第二段对我的暗示并非如此。

标签: c++ c++11 memory vector std


【解决方案1】:

当创建一个带有 n 个元素的std::vector 时(而不是只使用reserve 为它们保留空间而不实际创建),会在每个元素上调用默认构造函数。对于数字原语(例如ints 或doubles),默认构造函数的操作是将值设置为零。

【讨论】:

    【解决方案2】:

    CPP 参考文档:

    下面的重载构造函数将非类类型(如 int)的元素清零,这与 new[] 的行为不同,后者使它们未初始化。

    explicit vector( size_type count );   (since C++11)  (until C++14)
    explicit vector( size_type count, const Allocator& alloc = Allocator() );
    (since C++14)
    

    http://en.cppreference.com/w/cpp/container/vector/vector

    【讨论】:

    • 这可能就是我要找的。 new[] 保留未初始化的元素,而 new[]();才不是。直到
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2017-12-21
    • 2013-06-06
    • 2020-10-28
    • 2013-07-13
    • 2012-06-09
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多