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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-24 13:25:17496瀏覽

How Do Different Calling Conventions Impact Function Calls in C/C  ?

了解C/C 中的各種呼叫約定

C/C 提供了一系列呼叫約定,每個呼叫約定都有不同的特徵和含義用於函數呼叫。這些約定決定如何將參數傳遞給函數以及如何處理回傳值。

可用的呼叫約定

C/C 中可用的主要呼叫約定是:

  • cdecl:
  • cdecl:參數被壓入堆疊從右到左,包含被呼叫者保存的暫存器(EAX、ECX、EDX)和呼叫者保存的暫存器(堆疊指標和其餘暫存器)。
  • syscall: 與 cdecl 類似,但不保留 EAX、ECX 和 EDX。參數列表大小在 AL 中傳遞。
  • pascal: 參數從左到右壓入堆疊,被呼叫者負責堆疊平衡。
  • stdcall: pascal 的變體,其中被呼叫者負責堆疊清理,但參數被推送到堆疊上從右到左。 EAX、ECX 和 EDX 指定在函數內使用。

fastcall: 將前兩個參數傳遞到 ECX 和 EDX暫存器,並將剩餘參數從右到左傳遞到堆疊.

擴充通話約定
  • 除了這些標準約定​​之外,還有一些專門的變體:
  • 向量呼叫:使用SIMD暫存器傳遞向量參數,擴展對傳遞的支援同質向量聚合值。
  • safecall: 封裝 COM 錯誤處理,異常在 EAX 中作為 HResult 傳回,結果透過堆疊上的參考傳遞。

Microsoft X64 呼叫約定: 對整數和浮點參數使用特定暫存器,並將其他參數推送到堆疊。呼叫者負責在堆疊上分配「影子空間」。

選擇正確的約定

適當的呼叫約定取決於特定的平台、編譯器,以及申請要求。選擇呼叫約定時要考慮參數數量、暫存器使用情況和效能最佳化等因素。 例如,stdcall 常用於呼叫 Windows API 函數,而 cdecl 常用於類別 Unix 環境。 fastcall 可以為參數較少的函數提供更快的效能。

  • 其他資源
[Microsoft 文件:呼叫約定](https://docs.microsoft.com) com/en-us/cpp/build/x64-calling-convention)[維基百科:呼叫約定](https://en.wikipedia.org/wiki/Calling_convention)

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

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