为什么std::vector零初始化它的内存?
Why does std::vector zero initilize its memory?
我最近注意到 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()
似乎总是 return true
而 array_zeroed()
returns false
.
我显然在这里遗漏了一些东西,但我不知道是什么。
当创建一个包含 n 个元素的 std::vector
时(而不是仅使用 reserve
为它们保留 space 而无需实际创建),默认构造函数将在每个元素上调用元素。对于数字基元(例如 int
s 或 double
s),默认构造函数的操作是将值设置为零。
CPP 参考文档:
下面的重载构造函数将非class 类型的元素归零,例如 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)
我最近注意到 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()
似乎总是 return true
而 array_zeroed()
returns false
.
我显然在这里遗漏了一些东西,但我不知道是什么。
当创建一个包含 n 个元素的 std::vector
时(而不是仅使用 reserve
为它们保留 space 而无需实际创建),默认构造函数将在每个元素上调用元素。对于数字基元(例如 int
s 或 double
s),默认构造函数的操作是将值设置为零。
CPP 参考文档:
下面的重载构造函数将非class 类型的元素归零,例如 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)