изменение размера по сравнению с push_back в std :: vector: избегает ли это ненужного копирования? - PullRequest
22 голосов
/ 14 декабря 2009

При вызове метода push_back из std::vector его размер увеличивается на единицу, что подразумевает создание нового экземпляра, а затем передаваемый параметр будет скопирован в этот недавно созданный элемент, верно? Пример:

myVector.push_back(MyVectorElement());

Что ж, если я хочу увеличить размер вектора с помощью элемента, просто используя его значения по умолчанию, не лучше ли вместо этого использовать метод resize? Я имею в виду, как это:

myVector.resize(myVector.size() + 1);

Насколько я вижу, это могло бы быть выполнено точно так же, но позволило бы избежать абсолютно ненужной копии назначения атрибутов элемента.

Правильно ли это рассуждение или я что-то упустил?

Ответы [ 11 ]

0 голосов
/ 14 декабря 2009

Я подозреваю, что фактический ответ в значительной степени зависит от реализации STL и используемого компилятора, однако у функции "resize" есть прототип ( ref )

void resize( size_type num, TYPE val = TYPE() );

, что подразумевает, что val создается по умолчанию и копируется во вновь выделенное (или, возможно, ранее выделенное, но неиспользуемое) пространство посредством размещения new и конструктора копирования. Таким образом, обе операции требуют одинаковой последовательности действий:

  1. Вызов конструктора по умолчанию
  2. Распределить пространство
  3. Инициализация с помощью конструктора копирования

Вероятно, лучше отложить до более ясного и более общего (с точки зрения контейнеров STL) push_back, чем применять преждевременную оптимизацию - если профилировщик выделяет push_back как горячую точку, то наиболее вероятной причиной является выделение памяти, Лучше всего решать с помощью разумного использования резерва.

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