ホームページ > バックエンド開発 > C++ > C/C コンパイラはローカル変数の作成にプッシュ/ポップ命令を利用しますか?

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

Mary-Kate Olsen
リリース: 2024-12-09 11:58:10
オリジナル
246 人が閲覧しました

Do C/C   Compilers Utilize Push/Pop Instructions for Local Variable Creation?

ローカル変数のプッシュ/ポップ命令を備えた C/C コンパイラー

概要

従来の C/C コンパイラーは、スタック ポインターを増やすことによってローカル変数を作成します(ESP)1回。ただし、プッシュ/ポップ命令を使用すると、コードがよりコンパクトになり、潜在的に高速になる可能性があります。この記事では、この最適化を提供するコンパイラについて説明します。

コンパイラのサポート

調査によると、4 つの主要な x86 コンパイラ (GCC、Clang、ICC、MSVC) は現在、push/ を使用していません。ローカル変数を作成するためのポップ命令。代わりに、sub rsp, c を使用してスタック ポインタを減らす、古い方法のバリエーションが好まれています。

プッシュ/ポップの利点

ローカル変数にプッシュ/ポップを使用すると、いくつかの利点があります。

  • コードサイズの削減: プッシュ命令は、 sub/mov ペアの場合は 9 ~ 11 バイト。
  • 潜在的なパフォーマンス向上: スタック エンジンを備えた CPU では、プッシュ操作で発生するスタック同期 UOP が sub RSP よりも少なくなり、高速化される可能性があります。特定のシナリオ。

プッシュ/ポップを避けるべき場合

プッシュ/ポップ中有益な場合もありますが、すべての場合にお勧めできるわけではありません。たとえば、[rsp x] アドレッシング モードと混合すると、余分なスタック同期 UOP が発生する可能性があります。

実際の使用例

次の関数を考えてみましょう:

int extfunc(int *,int *);

void foo() {
    int a=1, b=2;
    extfunc(&a, &b);
}
ログイン後にコピー

を使用してコンパイルを改善しましたPush/pop:

# compiled for the x86-64 System V calling convention:
# integer args in rdi, rsi  (,rdx, rcx, r8, r9)
    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
ログイン後にコピー

注: この例では、push 命令の最後の 4 バイトを lea 命令の最初の 4 バイトとオーバーラップさせることで、コンパクトさと速度を最適化します。 .

結論

プッシュ/ポップ命令は、コードサイズとパフォーマンス上の利点を提供します。ローカル変数は、現在主流の C/C コンパイラでは使用されていません。これは、余分なスタック同期 UOP が発生する可能性と、スタック オフセットの管理が複雑であることが原因であると考えられます。ただし、ハードウェアとコンパイラの最適化が進むにつれて、ローカル変数のプッシュ/ポップが将来的により広く採用される可能性があります。

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

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