Вводит ли новая переменная поражение при оптимизации возвращаемого значения?

Мы все это знаем

Foo returnAFoo()
{
    return Foo();
}

будет скомпилирован с оптимизацией возвращаемого значения, поэтому копия значения не будет взята, даже если конструктор копирования Foo имеет побочные эффекты. Но будет

Foo returnAFoo()
{
    Foo f = Foo();
    return f;
}

тоже? Вторая конструкция может быть полезна при отладке. Но я выбрасываю важную оптимизацию при этом? Возможно, мне нужно написать явный конструктор перемещения?

1 ответ

Решение

Нет. Копия elision все еще может быть применена здесь. В этом конкретном случае это называется NRVO (оптимизация с возвращаемым значением). Вам не нужен конструктор перемещения для выполнения удаления копии; elision copy был в стандарте с C++98/03, когда у нас были только конструкторы копирования.

Чтобы максимизировать ваши шансы на использование разрешения копирования, убедитесь, что либо: все пути кода возвращают один и тот же объект (NRVO), либо все пути кода возвращают временный объект (RVO).

Если вы смешиваете и сопоставляете NRVO и RVO внутри одной и той же функции, становится трудно применить оптимизацию.


Пример кода, демонстрирующий NRVO.

Другие вопросы по тегам