Нет, не совсем.
Однако при написании кода вы можете следовать рекомендациям.
Безымянная оптимизация возвращаемого значения
Этосрабатывает каждый раз, когда вы возвращаете временный объект, даже в режиме отладки.
return MyObject(....);
Оптимизация именованного возвращаемого значения
Это срабатывает практически каждый развремя, когда функция всегда возвращает один и тот же временный объект:
MyObject func() {
MyObject result;
if (...) { return result; }
result.push(0);
return result;
}
Вы можете смешивать их, но компилятору практически невозможно применить RVO в этом случае:
MyObject func() {
MyObject result;
if (...) { return MyObject(...); }
return result;
}
Здесь,вероятно, что одно возвращение получит выгоду от RVO, а другое - нет.И я бы поспорил на первую оптимизируемую, потому что вы застряли бы, если бы вы спекулятивно создали result
в обратном слоте и вдруг захотели взять ветку if
.Обратите внимание, что просто переупорядочение операторов просто работает:
MyObject func() {
if (...) { return MyObject(...); }
MyObject result;
return result;
}
Таким образом, практическое правило для NRVO заключается в том, что не должно быть оператора return
между объявлением result
и оператором return result;
, которые возвращаютчто-нибудь еще, кроме result
.
Если вы будете следовать этому, вы сложите шансы в свою пользу.И тогда это просто вопрос проверки кода.
И вы также облегчаете чтение своего кода, поскольку не объявляете переменные до того, как узнаете, что они действительно вам нужны!