Недавно я заметил, что std::vector
очищает память от нулей после выделения.Почему std :: vector zero инициализирует свою память?
Я создал аналогичные контейнеры раньше (хотя и не 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()
, кажется, всегда возвращаются true
в то время как array_zeroed()
возвращается false
.
Мне явно не хватает чего-то здесь, но я не знаю, что.
произойдет ли это в режиме выпуска? – tkausl
Как вы создали вектор? если вы использовали 'reserve', он не должен был обнулить память. – NathanOliver
Пожалуйста, будьте более ясны. Что именно * вы заметили? Какой код * точно * заставил вас это заметить? Я могу создать ситуации, когда 'std :: vector' не имеет нулевой памяти. Я могу создать ситуации, в которых 'std :: vector' выполняет нулевую память. – Yakk