优化小3d矢量结构的性能

jan*_*ver 4 c++ struct vector

我是C++的新手,有以下内容,让我们称之为问题.在我的计算机模拟中,我使用矢量工作了很多.我自己构建了一个表示向量的小结构,并希望学习如何进行操作(例如normalize()函数更有效.另外,使用C++有什么好处valarray吗?似乎有一些有用的方法预先实现.

我差点专门用 normalize()向量函数和加法/减法/乘法.由于我的所有向量只有三个元素,我对在项目中包含第三方库犹豫不决.

这是我的结构:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 我怎样才能加快速度 normalize()功能或这是否已经是最有效的方法?
  • 在保持内存和计算机时间用量较低的同时实现这样的结构/类的更多C++方法是什么?
  • 我是否应该选择超过我自己类型的valarray?

Pau*_*l R 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

注意:您可能想要考虑如何处理病态案例i == j == k == 0.