小さなコードを取得し-S
て、さまざまなオプションを指定してコンパイルすることは可能ですが、実際に何が変更されたのかを理解するのは困難です。コードをまったく異なるものにするために必要なのは、わずかな変更だけです。1 つの変数がレジスターに入るということは、そのレジスターが何かに使用できなくなり、関数内の残りのすべてのコードに連鎖反応を引き起こすことを意味します。
私は今日 (C++ に関する質問をするために) 2 つのほぼ同一の関数の同じコードを比較していましたが、ソース コードに 1 つの違いがありました。変数が 1 つの for ループ内の終了条件に使用される 1 つの変更により、アセンブラー コードの変更が行を超えました。コンパイラがレジスタを別の方法で配置することを決定したため、メイン変数の 1 つに別のレジスタを使用し、結果として他のすべてが変更されました。
関数に小さな変更を加えると、関数がインラインから非インラインに移動し、そのコードを呼び出すプログラム内のすべてのコードに大きな変更が加えられるケースを見てきました。
したがって、はい、ぜひ、さまざまな最適化を使用して非常に単純なコードをコンパイルし、 -S を使用してコンパイラが生成したコードを検査してください。次に、さまざまなバリアントを比較して、その効果を確認します。しかし、アセンブラー コードを読むことに慣れていて、実際に探しているものを理解していない限り、木を見て森を見るのは難しい場合があります。
また、最適化ステップはしばしば連携して機能することも考慮する価値があります。あるステップでは、別のステップがその作業を実行できます (インラインでは、ブランチのマージ、レジスタの使用などにつながります)。