我必须决定使用对象返回查询结果或通过引用传递给它们。查询将至少委托一次。如果我返回一个对象并进一步委托它,是否有编译器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);
答案 0 :(得分:1)
复制精算can be chained。所以,是的,RVO可以应用于delegator::foo
,NRVO可以应用于b::foo
,这些优化可以链接,因此无需复制。
此外,在这种情况下,由于所有函数都很简单且无法使用,优化器甚至可以为两个调用生成相同的输出。
一般来说,两者都很快。具体来说,你应该测量。
按值返回的优点是使用起来更简单,因为不需要单独的行来分配变量。此外,它允许您不关心返回的类型,只使用auto
- 不管您是否想要个人偏好。
在更一般的情况下,它不适用于您的代码,按值返回允许该类型是非默认可构造的。避免无论如何都要修改的对象的默认构造可以节省一些开销。