Возвращает ли возврат локальной переменной копию и уничтожает оригинал (NRVO)?
Введение:
Вопрос исследует поведение возврата локальной переменной в C. В частности, он исследует, является ли возвращаемый объект копией или исходным объектом, и как это влияет на уничтожение локальной переменной.
Оптимизация возвращаемого значения (NRVO):
С Если включена NRVO (оптимизация именованного возвращаемого значения), компилятор оптимизирует оператор возврата, чтобы избежать ненужного копирования или уничтожения локальной переменной. Это достигается путем непосредственного создания возвращаемого объекта в целевом хранилище, устраняя накладные расходы на промежуточные копии или перемещения. NRVO применяется при выполнении определенных условий, например, когда локальная переменная имеет автоматический срок хранения и имеет тот же тип, что и тип возвращаемого значения.
Пример с включенным NRVO:
Рассмотрите следующий код:
class Test { public: Test(int p) { std::coutПри включенном NRVO вывод будет следующим:
Constructor called Destructor calledВ этом случае NRVO оптимизирует оператор return и конструирует объект o непосредственно в хранилище для локальной переменной t. Конструктор вызывается один раз, а для объекта o вызывается только один деструктор.
Пример с отключенным NRVO:
Однако NRVO можно отключить с помощью -fno-elide- Флаг компилятора конструкторов. Без NRVO компилятор будет явно выполнять шаги создания и уничтожения копии.Constructor called Constructor called Destructor called Destructor calledВ этом случае конструктор вызывается дважды (для локальной переменной t и возвращаемого объекта o). Кроме того, как локальная переменная t, так и возвращаемый объект o уничтожаются отдельно.
Вывод:
Поведение возврата локальной переменной зависит от того, включен или отключен NRVO. При включенном NRVO локальная переменная оптимизируется, а конструктор и деструктор вызываются только один раз для возвращаемого объекта. Без NRVO этапы создания и уничтожения копии выполняются явно, потенциально вызывая конструктор и деструктор несколько раз.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3