はい、ここで 3 つのことが行われています。リリース モードでビルドすると、コンパイラは最適化されたコード生成を行います。コンパイラは、ソース行がプログラムにコンパイルされる順序を変更する可能性があり (コードの意味を変更しない限り)、異なるソース行間の命令が混在または再配置される可能性があり、最終的に行に問題が発生する可能性があります。コンパイラが発行するテーブル。
2 つのソース行があり、それぞれが 8 つのアセンブリ言語命令になると想像してください。コンパイラは、これらの 16 個の命令を (結果が変わらない限り) 再配置して、CPU を最も効率的に実行し続けることができます。しかし、この状況で、コンパイラーはどの命令が 1 行目に相当すると言うべきでしょうか? また、コンパイラが 2 行目と同等であると言うべき命令はどれですか?
最適化されたコード デバッグでは、ソース コード レベルでデバッグしている場合、プログラムをステップ実行している間に "現在実行中のソース行" が何度も跳ね返るという現実を受け入れなければなりません。スコープ内にあるように見える変数は、明らかでないときに現れたり消えたりします。コンパイラの方法はトリッキーで理解しにくいものです。何が起こっているのかを実際に追跡するには、目の前のアセンブリ言語コード (またはソース + アセンブリ表示) を使用してデバッグする必要があります。
最適化されたコードのソースレベルのデバッグを改善するために、コンパイラーとデバッガーが行うことができる改善がありますが、おそらく常に従うのは少し難しいでしょう。