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 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 回答
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 和 NRVO复制省略以及在 C++11 中的移动语义。另外,请参阅这篇相关文章

编辑:我原来的答案被严重破坏了,这个答案有很大不同。

于 2012-05-21T06:20:04.140 回答