Оптимизация возвращаемого значения (RVO) - это метод оптимизации, включающий copy elision, который исключает временный объект, созданный для хранения возвращаемого значения функции в определенных ситуациях. Я понимаю выгоду RVO в целом, но у меня есть пара вопросов.
В этом стандарте говорится об этом в пункте 32 статьи 12.8 раздела этот рабочий проект (выделено мной).
Когда выполняются определенные критерии, реализации разрешено опускать конструкцию копирования/перемещения объекта класса , даже если конструктор copy/move и/или деструктор для объекта имеют побочные эффекты. В таких случаях реализация рассматривает источник и цель пропущенной операции копирования/перемещения как просто два разных способа обращения к одному и тому же объекту, а уничтожение этого объекта происходит в более поздние времена, когда эти два объекта были бы уничтожен без оптимизации.
Затем он перечисляет ряд критериев, когда реализация может выполнить эту оптимизацию.
У меня есть несколько вопросов относительно этой потенциальной оптимизации:
-
Я привык к ограничениям оптимизации, что они не могут изменять наблюдаемое поведение. Это ограничение, похоже, не относится к RVO. Должен ли я когда-нибудь беспокоиться о побочных эффектах, упомянутых в стандарте? Делать угловые случаи там, где это может вызвать проблемы?
-
Что мне нужно делать программисту (или не делать) для того, чтобы эта оптимизация выполнялась?. Например, запрещается ли использование исключения для копирования (из-за
move
):
std::vector<double> foo(int bar){
std::vector<double> quux(bar,0);
return std::move(quux);
}
Изменить
Я разместил это как новый вопрос, потому что конкретные вопросы, о которых я упоминал, не получили прямого ответа в других связанных вопросах.