Vector выполняет перераспределение при каждом push_back

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 элементов вместе с новым будут скопированы в новое место (я понял это, добавив операторы журнала в конструкторы копирования).

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

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

person infinity    schedule 27.04.2010    source источник
comment
Кстати говоря, было бы проще и эффективнее просто vClass1.push_back(Class1()); без выделения памяти в куче.   -  person doublep    schedule 28.04.2010


Ответы (2)


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

person Joshua    schedule 27.04.2010

  1. Это не обязательно, это оптимизация, потому что перераспределение стоит дорого.
  2. Я думаю, что это деталь реализации, как часто он перераспределяет. Я думаю, что для вектора нормально удваивать свое хранилище каждый раз, когда он перераспределяет, но, как я уже сказал, это может варьироваться в зависимости от реализации. (Возможно, поскольку вы находитесь в отладочной сборке, она перераспределяется чаще, чем обычно.)
person jwismar    schedule 27.04.2010
comment
@jwismar: Нет, его обработка памяти в порядке. Вектор будет содержать копию файла *objClass1, поэтому вполне законно удалить оригинал. - person doublep; 27.04.2010