Будет ли оптимизация возвращаемого значения в следующем примере? (Возможно, вопрос, зависящий от компилятора. В этом случае, я полагаю, мне интересно, "типичных" современных компиляторов, таких как недавний clang/gcc.)
Blah factory() {
return Blah();
}
void func() {
Blah blah;
if (condition) {
blah = factory();
blah.DoSomething();
} else {
blah = factory();
blah.DoSomethingElse();
}
blah.DoOneMoreThing();
}
Я знаю, что я явно не строю объект в той же строке, что и вызов фабричной функции, но достаточно умный компилятор может определенно оптимизировать копии в приведенном выше примере (поскольку экземпляр blah
не был затронут до того, как был установлен на factory()
).
Если RVO действительно не произойдет, есть ли способ избежать копирования без изменения factory
?
В вашей программе не будет никакой оптимизации возвращаемого значения, потому что Blah blah;
вызывает конструктор по умолчанию, который может иметь побочные эффекты (например, печать сообщения или блокировка мьютекса), а компилятору C++ не разрешено оптимизировать это. Как только blah
был сконструирован по умолчанию, он не может быть сконструирован снова в назначениях ниже, но оптимизация возвращаемого значения потребует построения.
Однако, если ваши определения оператора конструктора и оператора присваивания доступны для компилятора, он может оптимизировать сгенерированный код, чтобы он мог в конечном итоге оказаться таким же, как и конструктор копирования. Но это не гарантировано.
Blah x = factory(); if (condition) { xf(); } else { xg(); } xh();
?