C++: я должен явно использовать std::move() в операторе возврата для принудительного перемещения?
РЕДАКТИРОВАТЬ: это не дубликат, потому что этот вопрос спрашивает о решении компилятора в O0.
Здесь сказано, что Оптимизация возвращаемого значения имени (NRVO) - это поддержка многих компиляторов. Но это необходимость или просто приятная оптимизация?
Моя ситуация, я хочу скомпилировать -O0
(т.е. без оптимизации), для удобства отладки, но я также хочу, чтобы NRVO был включен для операторов возврата, которые возвращают объекты (скажем, вектор). Если NRVO не является обязательным, компилятор, вероятно, не будет делать это в -O0
Режим. В этом случае, я должен предпочесть этот код:
std::vector<int> foo() {
std::vector<int> v(100000,1); // an object that is really big..
return std::move(v); // explicitly move
}
за это ниже?
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // copy or move?
}
РЕДАКТИРОВАТЬ: компилятор я использую GCC6, но я хочу, чтобы код был независимым от компилятора.
1 ответ
Вы должны предпочесть
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // move or NRVO
}
над
std::vector<int> foo() {
std::vector<int> v(100000,1);
return std::move(v); // move
}
Второй фрагмент предотвращает NRVO, и в худшем случае оба переместятся в конструктив.