以下示例中是否会发生返回值优化? (可能是编译器相关的问题。在这种情况下,我想我对“典型的”现代编译器感到疑惑,比如最近的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
?
答案 0 :(得分:1)
在您的程序中不会有任何返回值优化,因为Blah blah;
调用可能有副作用的默认构造函数(例如打印消息或锁定互斥锁),而C ++编译器是不允许优化那个。一旦blah
被默认构建,就不能在下面的赋值中再次构建它,但是返回值优化需要构造。
但是,如果您的构造函数和赋值运算符定义可用于编译器,那么它可以优化生成的代码,使其最终可能最终与复制构造函数最终结束时相同。但这不能保证。