如果涉及委托,则c ++中的RVO和查询结果作为对象或更好地通过引用传递

时间:2015-12-28 14:01:29

标签: c++ rvo

我必须决定使用对象返回查询结果或通过引用传递给它们。查询将至少委托一次。如果我返回一个对象并进一步委托它,是否有编译器RVO。这是一个例子:

struct foo {int a, b, c, d;}

struct b {
   Foo foo() {Foo foo; /*calculate_with_foo;*/ return foo;}
   void foo1(Foo& foo) { /*calculate_with_foo;*/ } 
}

struct delegator {
   Foo foo() {return b.foo();}
   void foo1(Foo& foo)  {b.foo1(foo);}
   b b;
}

// Performes this slower or is here RVO at work?
delegator d;
foo result = d.foo()
// pass by reference, faster?
foo resultr;
d.foo1(resultr);

1 个答案:

答案 0 :(得分:1)

复制精算can be chained。所以,是的,RVO可以应用于delegator::foo,NRVO可以应用于b::foo,这些优化可以链接,因此无需复制。

此外,在这种情况下,由于所有函数都很简单且无法使用,优化器甚至可以为两个调用生成相同的输出。

一般来说,两者都很快。具体来说,你应该测量。

按值返回的优点是使用起来更简单,因为不需要单独的行来分配变量。此外,它允许您不关心返回的类型,只使用auto - 不管您是否想要个人偏好。

在更一般的情况下,它不适用于您的代码,按值返回允许该类型是非默认可构造的。避免无论如何都要修改的对象的默认构造可以节省一些开销。