Предположим, у меня есть следующий код:Является ли преждевременной оптимизацией использование std :: move()?
int main()
{
std::vector<std::string> strs;
std::string var("Hello World");
// Make some modifications to 'var'
strs.push_back(std::move(var));
}
Часть образца, я хочу отметить, является использование std::move()
. В основном меня беспокоит копия на звонок push_back()
. Предположим, что строка, которую я добавляю, действительно большая. Я все еще изучаю C++ 11 r-value-ссылки, поэтому я не уверен, как компилятор будет оптимизировать копию (если вообще) без std::move()
.
Может ли кто-нибудь объяснить, является ли это преждевременной оптимизацией (форсирование ходов во всех случаях, когда вы хотите избежать копирования вообще)? Если да, то какие шаблоны я должен ожидать, что компилятор будет следовать (или, скорее всего, следовать), что приведет к оптимизации и автоматическому перемещению здесь?
EDIT
Я хочу добавить, что я понимаю, как автоматические движения происходят на возвращении значения функции, поскольку применяется NRVO/РВО. Конкретный пример, который я привел здесь, не будет применяться RVO, поэтому я не уверен.
'move' действительно имеет смысл только в том случае, если вызываемая функция называется * move aware * (и тип поддерживает перемещение семантики.) В этом случае функция, которую вы вызываете, отсутствует, и поэтому вы ничего не получите от этого , Если, однако, вы вызываете функцию * move know * (скажем, 'emplace_back()'), тогда имеет смысл использовать 'std :: move()'. Тот же принцип применяется к любым вашим пользовательским функциям, типам и т. Д. – Nim
@Nim - это обязательно верно? Я рассматривал сценарий, в котором временное построено по ходу движения (из принудительного значения r, возвращаемого 'std :: move'), а затем это будет передано в push_back() как r-значение (const ref). Является ли этот сценарий неправильным? –
@Nim С тех пор, как 'push_back' не перемещается? –