Копирование std :: vector по элементу более оптимизировано, чем перемещение всего вектора - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь передать std :: vector настраиваемых объектов по ссылке на конструктор, который копирует / перемещает его в другой частный член std :: vector, но каким-то образом копирование его элемент за элементом в a for l oop генерирует меньший размер программы, чем при одновременном перемещении всего вектора.

Обычно в моем конструкторе есть этот код:

constructor(std::vector<object*>& newVec)
{
  for(int i=0; i<newVec.size(); ++i)
    this->vec.push_back(newVec[i]); 
}

, который генерирует Linux исполняемый файл, размер которого меньше с использованием std :: move следующим образом:

constructor(std::vector<object*>& newVec)
{
   this->vec=std::move(newVec);
}

Только переключая эти два фрагмента, я перехожу с 30 КБ на 35 КБ.

PS: Объект, содержащийся в векторе, отличается от объект-конструктор.

Может ли кто-нибудь объяснить мне, почему первая версия более оптимизирована, чем вторая?

1 Ответ

1 голос
/ 05 мая 2020

Я пытаюсь передать std :: vector настраиваемых объектов по ссылке на конструктор, который копирует / перемещает его в другой частный член std :: vector

В этом случае вы не следует использовать аргумент ссылки lvalue.

Либо передать по значению, либо ссылку r-значение.

Кроме того, было бы лучше инициализировать член напрямую, а не инициализировать по умолчанию, а затем переместить назначение позже.

Кто-нибудь может мне объяснить, почему первая версия более оптимизирована, чем вторая?

Возможных причин может быть много:

  • Возможно, вы не включили оптимизацию компилятора.
  • «Более оптимизировано» - это субъективно. Большинство людей больше заботятся о времени выполнения, чем о размере исполняемого файла. Таким образом, обе программы можно оптимизировать одновременно с разных точек зрения.
  • Использование одной функции вместо другой может увеличить общее количество функций, используемых в программе. Разумно, что это может увеличить размер исполняемого файла.
...