0

考虑以下两个相同功能的实现

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。

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

4

2 回答 2

0

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

于 2012-08-12T18:44:14.580 回答
0

假设——因为你没有给出太多的上下文——成员 a 和 b 是类向量,并且 set 函数用元素“填充”这个类向量对象......并假设 Object 的双参数构造函数复制从参数构造成员 a 和 b ...并假设您的编译器能够执行 NRVO 而不仅仅是 RVO(现在很常见)...第一个函数应该更有效,因为您不必须以这种方式复制 a 和 b。

于 2012-08-12T20:37:05.020 回答