есть ли в этом случае поддержка компилятора NRVO?
Определить "поддержку компилятора"?
Что f1
делает полностью уничтожить способность компилятора оптимизировать копию MyClass
.Давайте рассмотрим f1
подробно
MyClass &&o=MyClass();
Это создаст временную , а не переменную стека.Затем этот временный объект привязывается к ссылке на r-значение, называемой o
, которая продлевает время существования временного элемента до конца функции.
return std::move(o); //or return static_cast<MyClass &&>(o);
Возвращает ссылку на r-значение для стека.привязанная r-величина ссылается на временную.И поскольку вы возвращаете значение, а не ссылку, компилятор должен создать из него временное значение.
Копирование / перемещение временного значения в a
будет исключено.Но вы все еще создали два временных (оригинал и возвращаемое значение).
Итак, f1
делает следующее:
create temporary
copy/move from temporary to return value
elide copy/move from return value to `a`.
f2
делает:
create stack variable
elide copy/move from stack variable to `b`.
Если NVRO не существует, у вас есть:
create stack variable
copy/move from stack variable to return value
elide copy/move from stack variable to `b`.
Итак, f2
равно в худшем случае равно f1
.И, скорее всего, лучше.
Пожалуйста, перестаньте пытаться перехитрить компилятор.Просто позвольте копии elision делать свое дело.