哪个更快/更有效?

时间:2011-05-17 11:50:34

标签: c++ performance

目前正在学习C ++的效率,并想知道在方法中返回参数的效率。

想象一下带有add方法的Vector3f类。

代码一:

Vector3f Vector3f::add(const Vector3f &rhs) const {
    Vector3f result;
    result.x(x() + rhs.x());
    result.y(y() + rhs.y());
    result.z(z() + rhs.z());
    return result;
}

代码二:

Vector3f Vector3f::add(const Vector3f &rhs) const {
    return Vector3f(
                x() + rhs.x(),
                y() + rhs.y(),
                z() + rhs.z());
}

我知道第二个代码段效率更高,我希望有人可以给我一个确切的答案。我确定它与临时物体有关。

3 个答案:

答案 0 :(得分:5)

它可能与返回值优化(RVO)有关。因为第二种形式在返回对象时构造对象,所以允许编译器(并且通常会)通过直接在调用者的上下文中构造对象来跳过复制构造函数。

第一种形式也可以用类似的方式进行优化,但我经常看到编译器优化后者而不是前者。

答案 1 :(得分:1)

实际上,它与初始化有关:当您默认构建“Vector3f result时,xyz成员将被初始化。你并不总能控制成本,特别是对于“沉重”的成员。

调用具有所有成员值的构造函数允许对象首次初始化它的成员

但是如果你真的想保存一些中间步骤,你可以在类Vector3f上创建一个mutator,而不需要临时:

class Vector3f {
   ...
   Vector3f& operator+=( const Vector3f& other ) {
      x += other.x;
      y += other.y;
      z += other.z;
      return *this;
   }
};

并像

一样使用它
Vector3f a( 1,2,3 );
a += Vector3f( 0,0,1 );

答案 2 :(得分:0)

想知道编译器是如何做事的,这很好,但我想你明白,几乎总有更大的“炸鱼”。

在我看来,很多人都从老师和作者那里得到了关于表现的想法,他们对大型真正的软件没有多少经验。 我不知道如何解释微观问题的集中, 并且人们似乎不知道他们什么时候猜测,即使猜测是受过教育的。

所以,FWIW,here are some common conceptions about performance.