0

我必须决定返回带有对象的查询结果还是通过引用传递给它们。查询将至少委派一次。如果我返回一个对象并进一步委托它,是否有编译器 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);
4

1 回答 1

1

复制省略可以链接。所以是的,可以应用 RVO,也可以应用delegator::fooNRVO,b::foo并且这些优化可以链接起来,这样就不需要进行复制。

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

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

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

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

于 2015-12-28T14:16:11.943 回答