«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использует ли при возврате локальной переменной в C++ оптимизацию именованного возвращаемого значения (NRVO), чтобы избежать построения и уничтожения копирования?

Использует ли при возврате локальной переменной в C++ оптимизацию именованного возвращаемого значения (NRVO), чтобы избежать построения и уничтожения копирования?

Опубликовано 11 ноября 2024 г.
Просматривать:393

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

Возвращает ли возврат локальной переменной копию и уничтожает оригинал (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