2015-11-02 3 views
3

У меня есть куча методов, которые возвращают vector<int>. Они не возвращают ссылку или указатель на vector<int>, потому что возвращаемое значение не является частью состояния класса, оно просто генерируется «на лету» в зависимости от аргументов метода.избежать векторной копии конструктора

Я хотел бы избежать vector<int> экземпляр копирования, вызываемый при вызове метода, подобного этому.

vector<int> result = myClass.GenerateVectorOfInt(/* params */); 

// Do something with the result; 

Каков наилучший способ для этого?

Будет ли это приемлемым способом? Или есть другие лучшие или более элегантные решения.

vector<int> result = std::move(myClass.GenerateVectorOfInt(/* params */)); 
+1

Вы [проверили] (http://coliru.stacked-crooked.com/a/4fe331ecaf9498e7), что на самом деле вызывается конструктор копирования? – chris

+0

Не раньше, чем я разместил вопрос. Я поставил точку останова в конструкторе копии вектора, и он не попал. – mk33

ответ

6

Вам не нужно ничего особенного, компилятору разрешено удалять копию там, где это возможно. Это называется «Оптимизация возвращаемого значения» (RVO).

Даже если RVO не происходит, C++ 11 заставляет vector перемещаться на место, что дешево, независимо от его размера. (Обычно это 1 указатель и 2 целых назначения.) Таким образом, вектор будет никогда не быть скопирован, это худший случай.


Если по какой-либо причине РВО не бывает и шаг является слишком дорогим для USECASE (очень маловероятно), нет ничего, что вы можете сделать без изменения функции подписи; добавление std::move или что-то подобное в точке вызова не поможет.

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