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, и в худшем случае оба переместятся в конструктив.

Другие вопросы по тегам