clang、ICC、MSVC、gcc などの最新の C/C コンパイラーは、プッシュ/ポップ命令を直接使用することを避けます。代わりに、より効率的な sub/mov または lea 命令を使用してコードを最適化します。プッシュ/ポップは、呼び出し先が保存したレジスタの保存/復元やスタック引数の受け渡しなどの特定のシナリオで引き続き利用されます。
コンパイラは通常、スタック フレームの段階的な構築をサポートしません。プッシュ/ポップ命令を使用します。これは、エラー処理やデバッグのためのアンワインド メカニズムと競合し、アンワインド情報セクションが大きくなる可能性があるためです。さらに、プッシュ アドレス指定モードと [rsp] アドレス指定モードを混在させると、スタック同期 UOP が原因で Intel CPU の効率が低下する可能性があります。
プッシュ/ポップ命令はローカル変数の作成には有益であるように見えますが、現在コンパイラーはより効率的で、 sub/mov や lea などの信頼できるテクニック。プッシュ/ポップが引き続き使用される特定のシナリオがありますが、通常は段階的なスタック フレームの構築には使用されません。
以上がなぜ最新のコンパイラは段階的なスタック フレーム構築にプッシュ/ポップを使用しないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。