Используйте std::move при получении вывода функции

Я видел много дискуссий об использовании std::move для возвращаемого значения функции (например, this), и я знаю, что в этих случаях это не нужно. Но что, если я хочу использовать семантику std::move при получении вывода функции, как в приведенных ниже кодах:

std::vector<double> funcA()
{
    std::vector<double> out(10000, 0.0);
    return out;
}

int main()
{
    auto out = std::move(funcA());
    return 0;
}

Это хороший вариант использования std::move? Насколько я понимаю, move здесь можно избежать копирования возвращаемого вектора, особенно когда размер вектора очень велик. Пожалуйста, поправьте меня, если я ошибаюсь. Большое спасибо!


person Eddie Zhao    schedule 29.04.2021    source источник
comment
Нет, это не хороший случай. Это пессимизация. Просто верните его по значению и получите по значению, и копия, скорее всего, будет пропущена (если вы не используете очень старую версию/компилятор C++). Вот пример. Создан только один объект. Без копий и перемещений.   -  person Ted Lyngmo    schedule 30.04.2021
comment
Ваш код может привести к худшей производительности, чем без перемещения. Это потому, что компилятор выполнит copy elision, когда перемещения нет.   -  person freakish    schedule 30.04.2021


Ответы (1)


Это хороший вариант использования std::move?

No.

В хороших случаях использования std::move вызывается для lvalue. Это дает компилятору свободу рассматривать значение как временное* в большинстве случаев (но не во всех).

Вы звоните std::move по временному номеру*. Указание компилятору рассматривать ваш временный файл как временный в большинстве случаев (но не во всех) не дает компилятору новых возможностей, он их лишает.

*Под временным я подразумеваю prvalue.< /эм>

person Drew Dormann    schedule 30.04.2021