我最近问了一个关于结构的问题,并优化了一些重载运算符。
现在,我已经对这些改进(或其中一些/大部分)进行了改进,并返回以下函数(非成员函数,因为我希望它们在可能的情况下符合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;
}
(请注意,我省略了减法和另一个乘法运算符,因为它们等同于此处列出的其他运算符。)
我目前无法注意到任何其他潜在的改进。 我是否遗漏了任何东西,它会(可能)使这些功能成为现实,效率低下?
答案 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 NRVO,copy 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;
}