【问题标题】:Better way to implement arithmetic operator overloads with a n-dimensional C++ Vector class?使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?
【发布时间】: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);
}

感谢您的任何意见!

【问题讨论】:

标签: c++ performance vector


【解决方案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被返回,为什么不呢?
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多