0

最近、構造体と、いくつかのオーバーロードされた演算子の最適化について質問しました。

元の質問はここにあります

今、私はそれらの改善を心に留めました(またはそれらのいくつか/ほとんど)、そして私は次の関数(可能であればCに準拠することを望むので非メンバー関数)で戻ります。

inline Vector2& operator+=(Vector2 &a, const Vector2 &b)
{
    a.x += b.x;
    a.y += b.y;
    return a;
}

inline Vector2 operator+(Vector2 a, const Vector2 &b) 
{
    a += b;
    return a;
}

inline Vector2& operator*=(Vector2 &a, const float &n)
{
    a.x *= n;
    a.y *= n;
    return a;
}

inline Vector2 operator*(Vector2 a, const float &n) 
{
    a *= n;
    return a;
}

inline float operator*(const Vector2 &a, const Vector2 &b)
{
    return (a.x * b.x) + (a.y * b.y);
}

inline Vector2 rotate(const Vector2 &a, const float &angle)
{
    Vector2 out = a;
    out *= cos(angle);
    out.x -= sin(angle) * a.y;
    out.y += sin(angle) * a.x;
    return out;
}

(ここにリストされている他の演算子と同等であるため、減算と別の乗算演算子を省略したことに注意してください)。

現在、他の潜在的な改善に気付くことはできません。私は何かを見逃したことがありますか?それは(潜在的に)これらの機能を現在の状態で非効率的にしますか?

4

2 に答える 2

0

プロファイリングなしで改善について話すのは無意味です。ただし、ここには改善の余地がある可能性があります。

inline Vector2 rotate(const Vector2& a, const float &angle) {
    Vector2 out = a;
    out *= cos(angle);
    const float sinA + sin(angle);
    out.x -= sinA * a.y;
    out.y += sinA * a.x;
    return out;
}

sin(angle)ここでは、関数を2回呼び出す代わりに、の結果をキャッシュします。ただし、変更を試みる前にプロファイリングシステムを導入する必要があることを強調する必要があります。そうすれば、変更が効果を発揮するかどうかを確認し、改善が実際に価値があるかどうかを判断できます。コンパイラは、ソースコードを見ると非効率に見えるものを最適化する可能性があります。

RVOとNRVOコピーエリジオン、およびC++11では移動セマンティクスについて知っておく価値があります。また、この関連記事を参照してください。

編集:私の元の答えはひどく壊れていて、これは大きく異なります。

于 2012-05-21T06:20:04.140 に答える
0

また、+演算子と*演算子がおかしいと思います。値で入力し、演算子で変更してから、結果にコピーします(値で返します)。コンパイラがこれを最適化する可能性があります(ただし、確かではありません)。本でそれをすることはより速いかもしれないので、多分このような何か?

inline Vector2 operator+(Vector2 &a, const Vector2 &b) 
{
    Vector2 r;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    return r;
}
于 2012-05-21T08:30:04.570 に答える