假设我正在写一vector2D
库的rotate()
方法的实现。存储三角函数调用的结果是否有意义?
vector2D rotate(const vector2D vector, const vector2D origin, float radians)
{
// Implementation details
return {x, y};
}
我可以存储三角函数的结果调用的变量,所以我不必多次打电话给他们:
float sr = sin(radians);
float cr = cos(radians);
float x = origin.x + (
(vector.x - origin.x) * cr - (vector.y - origin.y) * sr
);
float y = origin.y + (
(vector.x - origin.x) * sr + (vector.y - origin.y) * cr
);
或者,我可以简单的写了我的意思
float x = origin.x + (
(vector.x - origin.x) * cos(radians) - (vector.y - origin.y) * sin(radians)
);
float y = origin.y + (
(vector.x - origin.x) * sin(radians) + (vector.y - origin.y) * cos(radians)
);
- 这些情况的优缺点是什么?
- 编译器是否优化了第二个示例中的开销?或者,即使在
vector2D
库的情况下,调用trig函数的开销多少也不明显?
gcc编译器将sin和cos映射到['__builtin_sin'和'__builtin_cos'](https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html),因此它具有这些函数的其他知识,但我不知道优化器是否会利用这一点。 –
GCC不仅可以保存sin/cos的结果,而且可以同时计算[两者同时](http://goo.gl/fkSLcf)。 Clang并不那么尖锐,可悲。另一件要考虑的事情是:如果你在双打中进行计算,则会产生更少的代码。 –
@Revolver_Ocelot'双打计算'是什么意思? “双打”作为第二个例子中的重复代码? – sjaustirni