たとえば、2つの整数を乗算するなどの数学演算を実行した後、C ++を使用してCPUのオーバーフローフラグレジスタにアクセスすることは可能ですか?そうでない場合、オーバーフローをチェックする他の高速な方法は何ですか?
5 に答える
いいえ、一般的には不可能です。一部の CPU にはそのようなフラグさえありません (MIPS など)。
コメントの1 つに提供されているリンクは、オーバーフロー チェックを行う方法についてのアイデアを提供します。
C および C++ では、符号付き整数のオーバーフローによって未定義の動作が発生し、法的には事後にオーバーフロー チェックを実行できないことに注意してください。符号なし算術演算を使用するか、算術演算の前にチェックを行う必要があります。
私はすべての適切な場合にこの読書をお勧めします。C++でのソフトウェアの最適化から -
整数のオーバーフローは別のセキュリティ問題です。公式のC標準では、オーバーフローが発生した場合の符号付き整数の動作は「未定義」であるとされています。これにより、コンパイラーはオーバーフローを無視するか、オーバーフローが発生しないと想定することができます。Gnuコンパイラの場合、符号付き整数のオーバーフローが発生しないという仮定は、コンパイラがオーバーフローチェックを最適化できるという不幸な結果をもたらします。この問題に対して考えられる解決策はいくつかあります。(1)オーバーフローが発生する前にチェックする、(2)符号なし整数を使用する-ラップアラウンドが保証されている、(3)オプション
-ftrapv
で整数オーバーフローをトラップするが、これは非常に非効率的です、(4)オプションを使用してこのような最適化についてコンパイラ警告を取得する-Wstrict-overflow=2
か、(5)オプションを使用してオーバーフロー動作を明確に定義する-fwrapv
または-fno-strict-overflow
。
これはおそらく、次の 2 つの理由からやりたくないことです。
- すべての CPU にオーバーフロー フラグがあるわけではありません
- C++ を使用すると、実際にはオーバーフロー フラグにアクセスする方法がありません
人々が以前に投稿したオーバーフロー チェックのヒントが役立つ場合があります。
2 つの整数を乗算してオーバーフロー フラグをチェックする高速なコードを本当に書きたい場合は、アセンブリを使用する必要があります。x86の例が必要な場合は、尋ねてください