2010-04-27 2 views
0

IDE - Visual Studio 2008, Visual C++Vector делает перераспределить на каждом push_back

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

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

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

Что касается несвязанной ноты, было бы проще и эффективнее просто «vClass1.push_back (Class1());», без выделения памяти кучи. – doublep

ответ

1

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

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

@jwismar: Нет, его обработка памяти в порядке. Вектор будет содержать * копию * '* objClass1', поэтому вполне законно удалять оригинал. – doublep

Смежные вопросы