ホームページ > バックエンド開発 > C++ > 最新の C/C コンパイラはローカル変数を効率的に管理するためにプッシュ/ポップ命令を利用していますか?

最新の C/C コンパイラはローカル変数を効率的に管理するためにプッシュ/ポップ命令を利用していますか?

Barbara Streisand
リリース: 2024-12-02 19:18:15
オリジナル
557 人が閲覧しました

Do Modern C/C   Compilers Utilize Push/Pop Instructions for Efficient Local Variable Management?

ローカル変数の作成にプッシュ/ポップ命令を利用できる C/C コンパイラーは何ですか?

概要

ESP を段階的に増加させる一般的な慣行とは対照的に、この質問は詳細を掘り下げています。コードのコンパクトさと場合によってはパフォーマンスを最適化することを目的として、ローカル変数を確立するためにプッシュ命令とポップ命令を採用する可能性があります。

コンパイラに関する考慮事項

コンパイラの最適化:

  • 4 つの主要な x86 コンパイラーすべて(GCC、ICC、MSVC、clang) は、最適化のためのプッシュを放棄しました。
  • これは主に、昔の CPU でのプッシュの使用率が高く、スーパースカラー コアの効率に悪影響を及ぼしたためです。
  • ただし、最新のコンパイラでは、特にスタック引数や呼び出し保存の操作において、パフォーマンス向上のためにプッシュ/ポップが再導入されています。

スタック エンジンの最適化:

  • Pentium-M 以降の Intel、Bulldozer 以降の AMD などの最近の CPU には、追跡する「スタック エンジン」が組み込まれています。 RSP の変更を効率的に行います。
  • この機能により、プッシュ/ポップ/コール/レットの使用が可能になります。パフォーマンスが低下することはありません。
  • プッシュ/ポップを慎重に使用すると、コード サイズだけでなく速度を最適化することでパフォーマンスの向上につながります。

コード サンプル

次の点を考慮してください例:

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 バイトに整列させたまま、両方のローカル変数にスペースを割り当てます。これにより、コード サイズが最適化され、効率が維持されます。

追加の考慮事項

  • プッシュと [rsp] アドレッシング モードを混合すると、Intel CPU に追加のスタック同期 UOP が導入される可能性があります。効率が低下する可能性があります。
  • コンパイラは、注意が必要なため、この最適化の実装を一般的に控えます。パフォーマンスの低下を避けるためのトレードオフの計算とバランス調整。

以上が最新の C/C コンパイラはローカル変数を効率的に管理するためにプッシュ/ポップ命令を利用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート