同じコードを最適化を完全に無効にして ( g++ -O0
) コンパイルし、次に最適化を完全に有効にして( ) コンパイルするg++ -O3
と、ソース コード自体のロジックをどのように変更できますか?
たとえば、コンパイラは次のことができます。
これら 2 つの最適化により、元のソース コードの整合性に影響を与えることなく、コードの実行速度が向上します。これらの最適化なしで実行されるコードは、それらを有効にして実行されます。
ただし、コンパイラの最適化はコード ロジックにも影響を与える可能性があります。私が知っている2つの例を次に示します。
- 一時オブジェクトからコピー コンストラクターと代入演算子を削除すると、考えられる副作用がなくなる可能性があります。
- 浮動小数点値を含む演算を並べ替えると、浮動小数点エラーに影響する可能性があります (
-ffast-math
引数が必要であることが期待されます)。
これらについて学べたことは非常に驚き、幸運でした。なぜなら、これらは間違った状況で大きな落とし穴になる可能性があるからです。
知りたいのですが、C++ コンパイラの最適化がコード ロジックに影響を与える他のケースはありますか? 特に g++ コンパイラでの c++11 (未定義の動作なし) に関する情報を探していますが、他のコンパイラのヒントは大歓迎です。