10
C ++での符号付きオーバーフローと未定義の動作(UB)
次のようなコードの使用について疑問に思っています int result = 0; int factor = 1; for (...) { result = ... factor *= 10; } return result; ループが何n度も繰り返される場合はfactor、10正確にn回数が掛けられます。ただし、合計回数をfactor掛けて使用します。ループの最後の反復以外はオーバーフローしないが、ループの最後の反復ではオーバーフローする可能性があると想定する場合、そのようなコードは受け入れ可能ですか?この場合、オーバーフローが発生した後、の値が使用されることはありません。10n-1factorfactor このようなコードが受け入れられるべきかどうかについて私は議論しています。ループがオーバーフローする可能性がある場合、乗算をifステートメント内に配置し、ループの最後の反復で乗算を実行しないことが可能です。欠点は、コードが煩雑になり、以前のすべてのループ反復をチェックする必要がある不要なブランチが追加されることです。また、ループの反復回数を1回減らし、ループの後にループ本体を1回複製することもできます。これもコードを複雑にします。 問題の実際のコードは、リアルタイムグラフィックスアプリケーションの総CPU時間の大部分を消費するタイトな内部ループで使用されます。