首頁 > 後端開發 > C++ > C/C 編譯器是否使用 Push/Pop 指令來建立局部變數?

C/C 編譯器是否使用 Push/Pop 指令來建立局部變數?

Mary-Kate Olsen
發布: 2024-12-09 11:58:10
原創
296 人瀏覽過

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

局部變數的Push/Pop 指令的C/C 編譯器

簡介

傳統的C/C 編譯器透過增加堆疊指標來創建局部變數(ESP)一次。然而,使用入棧/出棧指令可以產生更緊湊且可能更快的程式碼。本文探討了哪些編譯器提供此最佳化。

編譯器支援

研究顯示所有四個主要x86 編譯器(GCC、Clang、ICC 和MSVC)目前都不使用推送/彈出來建立局部變數的指令。相反,他們更喜歡舊方法的變體,使用 sub rsp, c 來減少堆疊指標。

Push/Pop 的優點

對局部變數使用push/pop 有幾個優點:

  • 程式碼大小減少: 與subsub /mov 對為9-11 個位元組。
  • 潛在的效能改進:在具有堆疊引擎的CPU 上,推播操作可能比sub rsp 產生更少的堆疊同步uops,從而使其速度更快

何時避免Push/Pop

雖然Push/Pop可以是有益的,但不建議在所有情況下都這樣做。例如,與 [rsp x] 尋址模式混合時,它可能會導致額外的堆疊同步 uops。

實際用例

考慮以下函數:

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 個位元組重疊來優化緊湊性和速度.結論雖然push/pop指令可以為創建本地程式碼提供程式碼大小和效能優勢變量,目前主流C /C 編譯器尚未使用它們。這可能是由於可能存在額外的堆疊同步微指令以及管理堆疊偏移的複雜性。然而,隨著硬體和編譯器最佳化的發展,局部變數的推送/彈出將來可能會得到更廣泛的採用。

以上是C/C 編譯器是否使用 Push/Pop 指令來建立局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板