首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以一种有效的方式增加c++重载

以一种有效的方式增加c++重载
EN

Stack Overflow用户
提问于 2015-07-05 01:23:46
回答 2查看 138关注 0票数 0

我写了一个这样的类:

代码语言:javascript
复制
class vector3D{
    public:
    double x,y,z;
}

和I重载+运算符:

代码语言:javascript
复制
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;
    }
}

但是使用C=A+B的速度要慢于

代码语言:javascript
复制
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)

EDIT:这是我测试两种方法的速度的方法(在main()中):

代码语言:javascript
复制
//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;

结果是:

代码语言:javascript
复制
case A took: 5.539[1, 1, 1]
case B took: 1.531[2, 2, 2]
EN

回答 2

Stack Overflow用户

发布于 2015-07-05 01:47:21

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

但是,看看您想要的“有效负载行”,它们与您在operator+=主体中添加一些other的内容非常相似

代码语言:javascript
复制
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+= (另请参见this question)。

票数 1
EN

Stack Overflow用户

发布于 2015-07-05 01:58:07

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

代码语言:javascript
复制
vector3D operator+(const vector3D &lhs)
    {
        return vector3D(x+lhs.x,y+lhs.y,z+lhs.z);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31223320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档