ローカル変数の作成にプッシュ/ポップ命令を利用できる C/C コンパイラーは何ですか?
概要
ESP を段階的に増加させる一般的な慣行とは対照的に、この質問は詳細を掘り下げています。コードのコンパクトさと場合によってはパフォーマンスを最適化することを目的として、ローカル変数を確立するためにプッシュ命令とポップ命令を採用する可能性があります。
コンパイラに関する考慮事項
コンパイラの最適化:
スタック エンジンの最適化:
コード サンプル
次の点を考慮してください例:
int extfunc(int *, int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
コンパイラー出力
GCC、ICC、MSVC、および Clang はすべて、プッシュ命令で始まり、その後にスタック操作と呼び出しが続くコードを生成します。 exfuncへ。これは、最新のコンパイラが最適化にプッシュを利用しているという観察と一致しています。
最適な解決策
さらに最適化された解決策は次のようになります。
push 2 # only 2 bytes lea rdi, [rsp + 4] mov dword ptr [rdi], 1 mov rsi, rsp # special case for lea rsi, [rsp + 0] call extfunc(int*, int*) pop rax # alternative to add rsp,8 ret
Inこの場合、単一のプッシュ命令は、スタックを 16 バイトに整列させたまま、両方のローカル変数にスペースを割り当てます。これにより、コード サイズが最適化され、効率が維持されます。
追加の考慮事項
以上が最新の C/C コンパイラはローカル変数を効率的に管理するためにプッシュ/ポップ命令を利用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。