首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言函數調用慣例:__stdcall/__cdecl/__fastcall 詳解

     編輯:關於C語言

四大主流調用約定

約定參數傳遞棧清理方名字修飾典型用途
__cdecl右→左壓棧調用者前綴 _C/C++ 預設、可變參數
__stdcall右→左壓棧被調用者前綴 _ + @nWin32 API、COM
__fastcall前兩個 DWORD 用 ECX/EDX,其餘壓棧被調用者前綴 @ + @n高頻小函數優化
thiscallthis 在 ECX,其餘右→左被調用者編譯器內部C++ 非靜態成員函數

關鍵差異解析

__cdecl(C Declaration)

  • 唯一支援可變參數(printf 等),因調用者知曉參數大小才能清理棧。
  • 每調用點含清理代碼 → 代碼體積略大。
  • VC++ 預設值(/Gd)。

__stdcall(Standard Call)

  • 等同 16 位時代的 PASCAL 約定。
  • 被調用者清理棧 → 調用點代碼精簡,但不支援可變參數。
  • Win32 API 統一採用,WINAPI 宏展開為 __stdcall。
  • 修飾示例:_Func@12(12 字節參數)。

__fastcall

  • 利用寄存器傳前兩個雙字參數,減少內存讀寫。
  • 修飾示例:@Func@12。
  • 適合參數少、調用極頻繁的葉子函數。

thiscall

  • 隱式 this 指針放 ECX,不可手動指定(非關鍵字)。

裸調用 naked call

  • 編譯器不生成序言/結語(保存/恢復 ESI/EDI/EBX/EBP)。
  • 需搭配 __declspec(naked),用於手寫組合語言或極致優化。

指定方式

  • 函數前加關鍵字:__stdcall void Func(int a);
  • 專案屬性 → C/C++ → Code Generation → Calling Convention(/Gz /Gd /Gr)。
  • 函數級關鍵字優先於專案設定。

實戰建議

  • 編寫 DLL 導出函數 → __stdcall(配合 WINAPI)。
  • 普通 C/C++ 內部函數 → 預設 __cdecl 即可。
  • 極度熱點路徑、參數 ≤2 → 嘗試 __fastcall 測試性能。
  • 跨語言調用(C++ 調 C、汇编混編) → 統一約定、注意名字修飾。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved