2016-11-02 6 views
0

Недавно я заметил, что 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.

Мне явно не хватает чего-то здесь, но я не знаю, что.

+1

произойдет ли это в режиме выпуска? – tkausl

+1

Как вы создали вектор? если вы использовали 'reserve', он не должен был обнулить память. – NathanOliver

+5

Пожалуйста, будьте более ясны. Что именно * вы заметили? Какой код * точно * заставил вас это заметить? Я могу создать ситуации, когда 'std :: vector' не имеет нулевой памяти. Я могу создать ситуации, в которых 'std :: vector' выполняет нулевую память. – Yakk

ответ

2

CPP справочная документация:

в ниже перегруженных конструкторах обнуляет элементы типов неклассовых, такие как INT, который отличается от поведения нового [], который оставляет их неинициализированными.

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

+0

Возможно, это то, что я ищу. new [] оставляют элементы неинициализированными, а новые [](); не. TIL –

3

При создании std::vector с n элементами (в отличие от использования только reserve, чтобы зарезервировать место для них без фактического создания), конструктор по умолчанию вызывается на каждом из элементов. В случае числовых примитивов (например, int s или double s) действие конструктора по умолчанию - установить значение в ноль.