c++以一种有效的方式重载plus

c++ overloading plus in an efficient way

本文关键字:有效 方式 重载 plus 一种 c++      更新时间:2023-10-16

我写了一个这样的类:

class vector3D{
    public:
    double x,y,z;
}

和i过载+操作员:

class vector3D{
    public:
    double x,y,z;
    vector3D operator+(const vector3D &lhs)
    {
        vector3D temp(x+lhs.x,y+lhs.y,z+lhs.z);
        return temp;
    }
}

但是使用CCD_ 1比慢

C.x = A.x + B.x;
C.y = A.y + B.y;
C.z = A.z + B.z;

我认为这是因为在+重载函数中定义了一个vector3D实例。有什么可以避免的吗?

(仅供参考:我使用以下标志构建:-Wall -Wextra -Wunreachable-code -m32 -DNDEBUG -O2 -D_LARGEFILE64_SOURCE -D_REETRANT -D_THREAD_SAFE(

编辑:这就是我如何测试两种方法的速度(在main((中(:

//test bench
vector3D A(0.0,0.0,0.0), B(1e-9,1e-9,1e-9);
clock_t c = clock();
//case A
for(long int i=0;i<1000000000;i++)
{
    A = A + B;
}
cout<<"case A took: "<<1.0*(clock()-c)/CLOCKS_PER_SEC<<A<<endl;
c = clock();
//case B
for(long int i=0;i<1000000000;i++)
{
    A._x = A._x+B._x;
    A._y = A._x+B._y;
    A._z = A._x+B._z;
}
cout<<"case B took: "<<1.0*(clock()-c)/CLOCKS_PER_SEC<<A<<endl;

结果是:

case A took: 5.539[1, 1, 1]
case B took: 1.531[2, 2, 2]

由于您正在创建一个额外的对象,它将带来一些开销。这是固有的。

然而,看看您想要的"有效负载行",它们与operator+=主体中添加一些other:的内容非常相似

vector3D &operator+=(const vector3D &other) // Note - no objects created.
{
    x += other.x;
    y += other.y;
    z += other.z;
    return *this; // Note - return by reference.
}

当然,operator+=会修改其左操作数(这正是operator+及其对象创建开销的原因(。

一般来说,对于适用的重物,您应该更喜欢operator+=(另请参阅此问题(。

通过将其折叠为一行并利用返回值优化,您实际上可以获得性能提升:

vector3D operator+(const vector3D &lhs)
    {
        return vector3D(x+lhs.x,y+lhs.y,z+lhs.z);
    }