Copy Elision (пропуск копирования) - это оптимизация компилятора, которая позволяет избежать избыточных операций копирования/перемещения объектов в определенных ситуациях. Это одна из немногих оптимизаций, разрешенных стандартом C++ даже когда это изменяет наблюдаемое поведение программы (поскольку конструкторы копирования/перемещения могут иметь побочные эффекты).
class Widget {
public:
Widget() { std::cout << "Constructor\n"; }
Widget(const Widget&) { std::cout << "Copy Constructor\n"; }
```Widget() { std::cout << "Destructor\n"; }
};
Widget createWidget() {
return Widget(); // Создается временный объект
}
int main() {
Widget w = createWidget();
return 0;
}
В зависимости от ситуации и поддержки компилятором оптимизаций:
Без оптимизаций (теоретически):
С RVO (реальный случай в современных компиляторах):
Widget createWidget(bool flag) {
Widget a, b;
if (flag) return a;
return b; // NRVO может не сработать
}
Copy Elision - важная оптимизация, минимизирующая накладные расходы при работе с временными объектами. В современных C++ (17+) для простых случаев возврата по значению гарантируется 1 вызов конструктора и 1 вызов деструктора без промежуточных копирований. Для более сложных случаев NRVO может помочь, но не гарантирован. Всегда учитывайте это при проектировании классов с "тяжелыми" конструкторами копирования.