Vector2运营商的改进

时间:2012-05-21 06:09:34

标签: c++ c vector inline operator-keyword

我最近问了一个关于结构的问题,并优化了一些重载运算符。

The original question is here

现在,我已经对这些改进(或其中一些/大部分)进行了改进,并返回以下函数(非成员函数,因为我希望它们在可能的情况下符合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;
}

(请注意,我省略了减法和另一个乘法运算符,因为它们等同于此处列出的其他运算符。)

我目前无法注意到任何其他潜在的改进。 我是否遗漏了任何东西,它会(可能)使这些功能成为现实,效率低下?

2 个答案:

答案 0 :(得分: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)的结果,而不是两次调用该函数。但我真的要强调你在尝试任何改变之前应该有一个分析系统,这样你就能看出它们是否有所作为,并衡量是否有任何改进实际上是值得的。在查看源代码时,编译器可能会优化掉看起来效率低下的东西。

值得了解RVO and NRVOcopy ellision以及在C ++ 11中move semantics。另请参阅此relevant article

编辑:我的原始答案被严重破坏,而且这个答案明显不同。

答案 1 :(得分:0)

我也发现你的+和*运算符很奇怪。引入一个by值,在operator中修改它,然后将其复制到result(并按值返回)。编译器可能会对此进行优化(但不确定)。 通过这本书来做可能会更快,所以也许这样的事情?

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