gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:54:27 25 4
gpt4 key购买 nike

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

最佳答案

复制省略号 can be chained .所以是的,RVO 可以应用于 delegator::foo 并且 NRVO 可以应用于 b::foo 并且这些优化可以链接起来,这样就不需要进行复制.

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

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

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

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

关于c++ - 如果涉及委托(delegate),C++ 中的 RVO 和查询结果作为对象或更好地通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34494955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com