RVO — это оптимизация компилятора, но она может обеспечить действительно полезное повышение производительности. Однако это не гарантируется и на них нельзя положиться.
Что-нибудь в самом стандарте языка может оптимизировать возвращаемое значение? Семантика Move по-прежнему копирует значения членов, правильно?
Я не знаю, правильно ли я понял ваш вопрос, но (N) RVO на самом деле «в самом стандарте языка». Это называется разрешением копирования и описано в §12.8.31.
На самом деле, конструкция перемещения более затратна в вычислительном отношении, чем RVO, потому что, как вы сказали, она все еще должна «копировать» переменные-члены из одной ячейки памяти в другую (мелкая копия объекта). RVO полностью исключает эти операции чтения / записи.
(N) RVO работает в большинстве случаев, и там, где он не может (когда функция может возвратить одну из нескольких переменных), сдвинуть конструкционные пики.
AFAIK существует консенсус, что все случаи «оптимизации возвращаемого значения», как вы его называете, достаточно охвачены, так как C ++ 11
C ++ 11 имеет гарантию неявного перемещения при возврате из функции определенным образом.
Кроме того, вы можете напрямую создать возвращаемое значение с помощью любого неявного конструктора через return {a,b,c};
синтаксис.
Наконец, rvo, если он терпит неудачу, становится неявным движением, а первое неявное движение выше часто превращается в nrvo, поэтому методы хорошо выровнены.