3

私は固定小数点演算ライブラリを検討しており、ライブラリ自体によって(式テンプレートを介して)どの程度の最適化を実行するかを決定するために、オプティマイザによってすでにどれだけの最適化が実行されるかを疑問視し始めました。たとえば、次の例を見てください。

//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_)

整数のオーバーフローを考慮した場合、この変換では同じ動作にはなりませんが。私のライブラリのユーザーは、おそらく数学的な同等性に関心があり、むしろ縮小版(おそらく式テンプレートを通じて提供される)を持っているでしょう。

さて、問題は次のとおりです。動作が厳密に同じではない場合でも、オプティマイザーはあえて最適化自体を実行しますか?そのような最適化を気にする必要がありますか?このような最適化は簡単ではないことに注意してください。実際には、これらの最適化を実際に行う場合、固定小数点演算を使用しているときにビットシフトを行う必要はほとんどありません。

4

1 に答える 1

1

a_これは、およびb_タイプが符号付きか符号なしかによって異なります。

CおよびC++では、符号付きオーバーフローは技術的に未定義の動作ですが、符号なしオーバーフローは2の補数演算を使用して実行されます。

それにもかかわらず、多くのプログラムが符号付きオーバーフローの2の補数の動作に依存しているため、一部のコンパイラはそのコードの最適化を拒否します。

最新の優れたコンパイラには、この特定の仮定を有効/無効にするオプションがあります。つまり、符号付き整数はオーバーフローしません。デフォルトのオプションはコンパイラによって異なります。

たとえば、GCCの場合は、オプション-fstrict-overflow/-fno-strict-overflowと関連する警告を参照してください-Wstrict-overflow

于 2012-10-15T09:33:24.120 に答える