首頁  >  文章  >  後端開發  >  C/C 中的不同呼叫約定如何影響函數執行?

C/C 中的不同呼叫約定如何影響函數執行?

Patricia Arquette
Patricia Arquette原創
2024-11-12 05:31:02757瀏覽

How do Different Calling Conventions in C/C   Impact Function Execution?

理解C/C 中的呼叫約定

在C/C 中,各種呼叫約定定義了傳遞參數、回傳值和呼叫函數時清理堆疊。這些約定包括 stdcall、extern、pascal 和其他幾個。

可用的調用約定

C/C 中有許多可用的調用約定:

  • cdecl:參數從右到左壓入堆疊,堆疊平衡由呼叫者處理。
  • syscall: 與 cdecl 類似,但 EAX 、ECX 和 EDX 暫存器不會保留。
  • pascal: 參數從左到右壓入堆疊,呼叫者負責堆疊清理。
  • stdcall: 呼叫者從右向左推送參數,被呼叫者清理函數中用於特定目的的堆疊、EAX、ECX 和 EDX。
  • fastcall: 前兩個經由 ECX 和 EDX 暫存器傳遞的參數,剩餘參數從右到左壓入堆疊。
  • vectorcall: 使用 SIMD 暫存器傳遞向量參數,處理向量類型和 HVA 值。
  • safecall: 封裝 COM 錯誤處理,在 EAX 中傳遞異常,並透過堆疊上的參考傳遞結果。
  • Microsoft X64 呼叫約定:在特定暫存器中傳遞的整數參數,在 XMM 暫存器中傳遞的浮點參數,為溢位分配的影子空間。

不同約定的意思

每個呼叫約定都有它的優點和缺點。例如,stdcall 簡化了呼叫者的職責,而 fastcall 則透過減少堆疊操作來提高效能。呼叫約定的選擇可能取決於作業系統、處理器架構和編碼風格偏好等因素。

其他資源

  • [維基百科:C呼叫約定](https://en.wikipedia.org/wiki/Calling_convention#C)
  • [呼叫你的函數! (x86 呼叫約定)](https://www.agner.org/optimize/calling_conventions.pdf)
  • [MSDN:Arm64 (AArch64) 呼叫約定](https://docs.microsoft.com / en-us/cpp/build/arm64-abi-for-visual-studio?view=vs-2022)

以上是C/C 中的不同呼叫約定如何影響函數執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn