Как можно было бы реализовать оптимизацию RVO/NRVO в компиляторе?

Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.

Короткий ответ

Что ответить на собеседовании

Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.

Подробный разбор

Ответ с пояснениями

Компилятор может создавать возвращаемый объект сразу в памяти результата вызывающей стороны. Для NRVO он связывает подходящую локальную переменную с этим же местом хранения.

Для return local; анализируется допустимость NRVO и пути управления; при нескольких несовместимых кандидатах оптимизация может не применяться. На уровне ABI крупный результат часто передаётся через скрытый указатель на место назначения, но конкретный механизм зависит от платформы.

Нужно корректно учитывать исключения, время жизни и вызовы деструкторов. Устранение копирования в разрешённых случаях может менять наблюдаемые вызовы copy/move-конструкторов. Начиная с C++17 создание результата из соответствующего prvalue — отдельная гарантированная семантика, а не просто необязательная NRVO. Поэтому реализацию обоих случаев нельзя описывать как одну и ту же эвристику оптимизатора.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее