返回值优化

时间:2012-08-12 18:36:58

标签: 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。此外,假设Object,A和B都具有不复制大量数据的移动构造函数。最后,假设编译器同时执行RVO和NRVO。

对于构造对象,哪一个更有效?

2 个答案:

答案 0 :(得分:0)

如果此实现使用3个子对象(A,B,C),那么后者看起来会更有效,因为对新创建的Object的成员值调用会更少。不过,我不认为这确实有所作为。我会选择你认为最具可读性的那个。

答案 1 :(得分:0)

假设 - 因为你没有提供太多的上下文 - 成员a和b是类似矢量的,并且set函数“填充”这个类似矢量的对象元素......并假设这两个参数对象复制的构造函数从参数构造成员a和b ...并假设您的编译器能够执行NRVO而不仅仅是RVO(现在很常见)...第一个函数应该更高效,因为你不必那样复制a和b。