目前正在学习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());
}
我知道第二个代码段效率更高,我希望有人可以给我一个确切的答案。我确定它与临时物体有关。
答案 0 :(得分:5)
它可能与返回值优化(RVO)有关。因为第二种形式在返回对象时构造对象,所以允许编译器(并且通常会)通过直接在调用者的上下文中构造对象来跳过复制构造函数。
第一种形式也可以用类似的方式进行优化,但我经常看到编译器优化后者而不是前者。
答案 1 :(得分:1)
实际上,它与初始化有关:当您默认构建“Vector3f result
时,x
,y
,z
成员将被初始化。你并不总能控制成本,特别是对于“沉重”的成员。
调用具有所有成员值的构造函数允许对象首次初始化它的成员 。
但是如果你真的想保存一些中间步骤,你可以在类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)
想知道编译器是如何做事的,这很好,但我想你明白,几乎总有更大的“炸鱼”。
在我看来,很多人都从老师和作者那里得到了关于表现的想法,他们对大型真正的软件没有多少经验。 我不知道如何解释微观问题的集中, 并且人们似乎不知道他们什么时候猜测,即使猜测是受过教育的。