从嵌套范围返回值优化

时间:2014-11-17 23:48:09

标签: c++ compiler-optimization

以下示例中是否会发生返回值优化? (可能是编译器相关的问题。在这种情况下,我想我对“典型的”现代编译器感到疑惑,比如最近的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

1 个答案:

答案 0 :(得分:1)

在您的程序中不会有任何返回值优化,因为Blah blah;调用可能有副作用的默认构造函数(例如打印消息或锁定互斥锁),而C ++编译器是不允许优化那个。一旦blah被默认构建,就不能在下面的赋值中再次构建它,但是返回值优化需要构造。

但是,如果您的构造函数和赋值运算符定义可用于编译器,那么它可以优化生成的代码,使其最终可能最终与复制构造函数最终结束时相同。但这不能保证。