Използвайте 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
Вашият код може да доведе до по-лоша производителност, отколкото без движение. Това е така, защото компилаторът ще изпълни елизия на копиране, когато преместването не е там.   -  person freakish    schedule 30.04.2021


Отговори (1)


Това добър случай за използване ли е за std::move?

No.

При добри случаи на използване std::move се извиква на lvalue. Това дава свобода на компилатора да третира стойността като временна* в повечето случаи (но не всички).

Обаждате се на std::move на временен*. Указването на компилатора да третира вашето временно като временно в повечето случаи (но не всички) не дава нови възможности на компилатора, а ги отнема.

*Под временно имам предвид prvalue.< /em>

person Drew Dormann    schedule 30.04.2021