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

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

Barbara Streisand
Barbara Streisand原創
2024-11-20 03:10:02306瀏覽

How Do Different Calling Conventions Impact C/C   Function Execution?

C/C 中不同的呼叫約定

C/C 提供了各種呼叫約定來指定如何處理函數參數和傳回值。理解這些約定對於優化程式碼和確保程式不同部分之間的高效互動至關重要。

可用的呼叫約定

C/C 中有多種可用的呼叫約定:

  • cdecl:在堆疊上傳遞的參數,在暫存器中傳回值(整數為EAX,浮點數為ST0)
  • syscall:與 cdecl 類似,除了 EAX 、ECX 和 EDX暫存器不保留
  • pascal:參數由左至右推送,被呼叫者平衡堆疊
  • stdcall:呼叫者-清理stdcall,參數從右向左推送,返回值在EAX
  • fastcall:前兩個參數在ECX和EDX中傳遞,剩餘參數在堆疊上
  • vectorcall:用於使用SIMD暫存器傳遞向量參數
  • safecall:封裝錯誤處理,HResults 在 EAX 中傳回
  • Microsoft X64 呼叫約定:用於Windows和UEFI,RAX中64位元回傳值,RCX-R9中傳遞64位元參數
  • thiscall:與cdecl類似,但this透過隱藏參數傳遞的指標

詳細解釋

cdecl:
在cdecl(按值呼叫)中,被呼叫函數承擔清理責任返回之前的堆疊。參數從右到左壓入堆疊。

pascal:
在 pascal(按值結果呼叫)中,被調用者負責在返回之前平衡堆疊。返回值也會在堆疊上傳回。

stdcall:
在stdcall(按值呼叫)中,被呼叫者負責清理堆疊。參數從右到左壓入堆疊,而返回值則儲存在 EAX 暫存器中。

fastcall:
在 fastcall(透過暫存器呼叫)中,前兩個參數在 ECX 和 EDX 暫存器中傳遞。其餘參數從右到左壓入堆疊。

**有關其他呼叫約定的更多詳細信息,請參閱以下綜合答案:]

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

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