Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 收益值优化_C++_Performance_Return Value_Copy Constructor - Fatal编程技术网

C++ 收益值优化

C++ 收益值优化,c++,performance,return-value,copy-constructor,C++,Performance,Return Value,Copy Constructor,考虑相同函数的以下两种实现 Object foo() { Object ret; ret.a.set(...); ret.b.set(...); return ret; } Object foo() { A a; a.set(...); B b; b.set(...); return Object(a, b); } 假设在构造之后必须调用A::set和B::set。此外,假设对象A和B都有不复制大量数据的移动构造函数

考虑相同函数的以下两种实现

Object foo()
{
    Object ret;
    ret.a.set(...);
    ret.b.set(...);
    return ret;
}

Object foo()
{
    A a;
    a.set(...);

    B b;
    b.set(...);

    return Object(a, b);
}
假设在构造之后必须调用A::set和B::set。此外,假设对象A和B都有不复制大量数据的移动构造函数。最后,假设编译器同时执行RVO和NRVO


在对象构造方面,哪一个更有效?

如果此实现使用3个子对象(A、B、C),则后者似乎更有效,因为对新创建的对象的成员值调用更少。不过,我不认为这真的有什么不同。我会选择你认为可读性最好的一个。

假设——因为你没有给出太多的上下文——成员a和b是向量状的,集合函数用元素“填充”这个向量状的对象。。。假设对象副本的双参数构造函数根据参数构造成员a和b。。。假设您的编译器能够执行NRVO,而不仅仅是RVO(目前非常常见)。。。第一个函数应该更有效,因为您不必以这种方式复制a和b。

取决于
对象
、编译器优化等。只需分析它为什么构造函数不采用完全构造对象所需的参数。只要这不是瓶颈(你应该能够证明这一点)。那么代码应该以一种最容易编写和维护的方式来编写。从理论上讲,我最好奇的是它的效率。