了解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中文網其他相關文章!