私は固定小数点演算ライブラリを検討しており、ライブラリ自体によって(式テンプレートを介して)どの程度の最適化を実行するかを決定するために、オプティマイザによってすでにどれだけの最適化が実行されるかを疑問視し始めました。たとえば、次の例を見てください。
//This is a totally useless function to exemplify my point
void Compare(FixedPoint a, FixedPoint b) {
if(a/b>10) {
... do stuff
}
}
さて、この関数では、FixedPoint
クラスの典型的な実装が原因になります
if( ( (a_<<N) / b_) > (10 <<N) ) {
... do stuff
}
N
小数ビットの数はどこにありますか。その式は数学的に次のように変換できます。
(a_ > 10*b_)
整数のオーバーフローを考慮した場合、この変換では同じ動作にはなりませんが。私のライブラリのユーザーは、おそらく数学的な同等性に関心があり、むしろ縮小版(おそらく式テンプレートを通じて提供される)を持っているでしょう。
さて、問題は次のとおりです。動作が厳密に同じではない場合でも、オプティマイザーはあえて最適化自体を実行しますか?そのような最適化を気にする必要がありますか?このような最適化は簡単ではないことに注意してください。実際には、これらの最適化を実際に行う場合、固定小数点演算を使用しているときにビットシフトを行う必要はほとんどありません。