4

我对 C++ 相当陌生,并且有以下问题,我们称之为问题。在我的计算机模拟中,我经常使用向量。我为自己构建了一个表示向量的小结构,并且想学习如何使操作(例如normalize()函数更高效。另外,使用 C++ 有什么好处valarray吗?它似乎预先实现了一些有用的方法.

我几乎只使用normalize()向量的函数和加法/减法/乘法。由于我所有的向量只有三个元素,所以我对在我的项目中包含 3rd 方库犹豫不决。

这是我的结构:

struct vector_t {
    int _i, _j, _k;
    vector_t(int i, int j, int k) {
        _i = i;
        _j = j;
        _k = k;
    }
    vector_t() {}
    inline int getI() { 
        return _i; 
    }
    inline int getJ() { 
        return _j; 
    }
    inline int getK() { 
        return _k; 
    }
    inline void setI(int val) { 
        _i = val; 
    }
    inline void setJ(int val) { 
        _j = val; 
    }
    inline void setK(int val) { 
        _k = val; 
    }
    void normalize() {
        float length = sqrt(_i*_i + _k*_k + _j*_j);
        _i /= length;
        _j /= length;
        _k /= length;
    }
};

还有我的问题:

  • 我怎样才能加快这个normalize()功能,或者这已经是最有效的方法了吗?
  • 在保持内存和计算机时间使用率较低的同时,实现这种结构/类的更 C++ 的方式是什么?
  • 我应该更喜欢 valarray 而不是我自己的类型吗?
4

2 回答 2

5

使用快速倒数平方根函数计算 1 / 长度,然后将每个元素乘以该因子。除了比sqrt这更快的功能之外,还可以用 3 个昂贵的除法运算换取 3 个相对便宜的乘法运算:

struct vector_t {
    float _i, _j, _k;

    // ...

    void normalize() {
        float r_length = Q_rsqrt(_i*_i + _k*_k + _j*_j);
        _i *= r_length;
        _j *= r_length;
        _k *= r_length;
    }
};

注意:您可能需要考虑如何处理i == j == k == 0.

于 2013-10-11T09:46:58.667 回答
2

这不会有很大的不同,但你的构造函数应该是这样的:

vector_t(int i, int j, int k)
: _i(i), _j(j), _k(k)
{
}

对于优化,您应该查看 SSE: http: //www.cortstratton.org/articles/OptimizingForSSE.php

于 2013-10-11T09:39:03.587 回答