Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用n维C++;向量类?_C++_Performance_Vector - Fatal编程技术网

C++ 用n维C++;向量类?

C++ 用n维C++;向量类?,c++,performance,vector,C++,Performance,Vector,我有自己的数学向量类,我在代码中使用它。我有一个新的需要将我的向量类推广到n维而不是仅仅两维 我的问题是,实现操作符重载的最佳方法是什么,这样做是否会带来很大的开销 现在,我将这些值存储在一个数组中 double *vals; .... vals = new double[dimension]; 这样,我实现了+运算符,如下所示: Vector Vector::operator+(Vector v) { Vector ret = Vector(dimension); for

我有自己的数学向量类,我在代码中使用它。我有一个新的需要将我的向量类推广到n维而不是仅仅两维

我的问题是,实现操作符重载的最佳方法是什么,这样做是否会带来很大的开销

现在,我将这些值存储在一个数组中

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+(const Vector &v) {
第二,大多数编译器实现了这一点,这将有助于消除多维实现中的本地
ret


当然,最好的方法是实现代码,对其进行基准测试,然后在必要时应用优化。Scott Meyers’是您在这里尝试做的这类事情的一个很好的参考资料。

如果您想要一个快速向量类,请使用模板的大小:

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;
}
模板
类向量{
双数据[大小];
公众:
双精度&运算符[](std::size_t x){返回数据[x];}
};
模板
向量运算符+(向量lhs、常量向量和rhs){
对于(标准::大小\u t i=0;i
只有当您想重新调整它们的大小,或者它们非常大时,才不需要动态调整它们的大小


有很多方法可以比这快得多,比如SSE。如果你想要高度优化的东西,你应该使用一个专用的数学库。

哎呀,绝对想要!在这个特殊的例子中,RVO不会被调用。如果它实际上没有返回ret,它就不会被调用。。。但是假设返回了
ret
,为什么不返回呢?
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;
}