c++以一种有效的方式重载plus
c++ overloading plus in an efficient way
我写了一个这样的类:
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);
}
相关文章:
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何以更有效的方式检查一个数字是否是素数?
- 为什么以这种方式使用迭代器有效?
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 以有效的方式从 Node .js运行 C 或C++代码
- 在这种情况下,如何以有效的方式使用模板
- 可能以有效的方式在模拟的循环中进行多线程
- 更有效的填充unordered_set方式?
- 持有多个特征矩阵Xd的最有效方式
- 存储资源的最有效方式
- 存储IPv4/IPv6地址的有效方式
- 使用单个索引访问子矩阵的有效方式
- 发出信号并保持pthread打开的有效方式
- 顺时针和逆时针旋转阵列的有效方式
- 使用Qt和OpenCV读取和处理视频文件的有效方式
- 这是将字符串作为参数传递给函数的内存有效方式
- 这是在c++中运行循环的有效方式吗?
- 在内存映射文件中交换字节的有效方式
- 将跨步数据复制到CUDA设备和从CUDA设备复制跨步数据的有效方式