Вектор делает перераспределение на каждом push_back - PullRequest
0 голосов
/ 27 апреля 2010

IDE - Visual Studio 2008, Visual C ++

  1. У меня есть собственный класс Class1 с конструктором копирования.
  2. У меня также есть вектор
  3. Данные вставляются с использованием следующего кода
 Class1* objClass1;
 vector<Class1> vClass1;

 for(int i=0;i<1000;i++) {

    objClass1 = new Class1();
    vClass1.push_back(*objClass1);
    delete objClass1;

}

Теперь при каждой вставке вектор перераспределяется, и все существующее содержимое копируется в новые местоположения. Например, если вектор имеет 5 элементов и если я вставляю 6-й элемент, предыдущие 5 элементов вместе с новым копируются в новое место (я понял это, добавив операторы log в конструкторы копирования.)

При использовании Reserve () это, однако, не происходит, как ожидалось! У меня есть следующие вопросы

  1. Обязательно ли всегда использовать резервный оператор?
  2. делает ли vector перераспределение каждый раз, когда я делаю push_back ; или это происходит потому, что я отлаживаю ?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010
  1. Это не обязательно, это оптимизация, потому что перераспределение стоит дорого.
  2. Я думаю, это деталь реализации, как часто она перераспределяется. Я думаю, что для вектора нормально удваивать объем памяти при каждом перераспределении, но, как я уже сказал, это может варьироваться в зависимости от реализации. (Возможно, из-за того, что вы находитесь в отладочной сборке, она перераспределяется чаще, чем обычно.)
1 голос
/ 28 апреля 2010

Узнайте, поместив свой тест конструктора копирования в не отладочный код, и дайте нам знать, что вы получите для своей платформы! ИМО вектор не должен перераспределяться при каждом возврате. Есть более умные способы управления памятью, и я бы поспорил, что разработчики этого не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...