Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.
Как можно было бы реализовать оптимизацию RVO/NRVO в компиляторе?
Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.
Для return local; анализируется допустимость NRVO и пути управления; при нескольких несовместимых кандидатах оптимизация может не применяться. На уровне ABI крупный результат часто передаётся через скрытый указатель на место назначения, но конкретный механизм зависит от платформы.
Нужно корректно учитывать исключения, время жизни и вызовы деструкторов. Устранение копирования в разрешённых случаях может менять наблюдаемые вызовы copy/move-конструкторов. Начиная с C++17 создание результата из соответствующего prvalue — отдельная гарантированная семантика, а не просто необязательная NRVO. Поэтому реализацию обоих случаев нельзя описывать как одну и ту же эвристику оптимизатора.
Источник: eel.is.