Вводит ли новая переменная поражение при оптимизации возвращаемого значения?
Мы все это знаем
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.