使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?
Posted
技术标签:
【中文标题】使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?【英文标题】:Better way to implement arithmetic operator overloads with a n-dimensional C++ Vector class? 【发布时间】:2011-12-25 01:55:33 【问题描述】:我在我的代码中使用了自己的数学向量类。我有一个新的需求,将我的向量类推广到 n 维,而不是只有 2 维。
我的问题是,实现运算符重载的最佳方法是什么,这样做会产生很大的开销吗?
我现在将值存储在一个数组中
double *vals;
....
vals = new double[dimension];
有了这个,我像这样实现 + 运算符:
Vector Vector::operator+(Vector v)
Vector ret = Vector(dimension);
for (int i = 0; i < dimension; i ++)
ret.vals[i] = vals[i] + v.vals[i];
此操作将完成很多并且必须快速运行。这是否比旧版本差很多(就速度而言)?
Vector Vector::operator+(Vector v)
return Vector(x + v.x, y + v.y);
感谢您的任何意见!
【问题讨论】:
哎呀,绝对想要那个! tvmet.sourceforge.net 【参考方案1】:如果你想要一个快速的矢量类,那么使用模板来确定大小:
template<std::size_t size>
class Vector
double data[size];
public:
double& operator[](std::size_t x) return data[x];
;
template<std::size_t size>
Vector<size> operator+(Vector<size> lhs, const Vector<size>& rhs)
for (std::size_t i = 0; i < size; ++i)
lhs[i] += rhs[i];
return lhs;
仅当您想重新调整它们的大小或它们非常大时,才不需要将它们设置为动态大小。
有比这更快的方法,例如 SSE。如果你想要一些高度优化的东西,你应该使用专门的数学库。
【讨论】:
【参考方案2】:首先,我建议通过 reference 而不是按值传递您的操作数,以避免不必要的对象复制:
Vector Vector::operator+(const Vector &v)
其次,大多数编译器都实现了Return Value Optimization,这将有助于消除多维实现中的本地ret
。
当然,最好的方法是实现您的代码,对其进行基准测试,然后然后在必要时应用优化。 Scott Meyers 的Effective C++ 是您在这里尝试做的事情的绝佳参考。
【讨论】:
RVO 在此特定示例中不会被调用。 好吧,如果它实际上没有return ret;
...但假设ret
被返回,为什么不呢?以上是关于使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章