假設我正在寫一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