stdcall 與 _cdecl 的區別

 

(1) __stdcall調用
__stdcall是Pascal程序的缺省調用方式,參數採用從右到左的壓棧方式,被調函數自身在返回前清空堆棧
WIN32 Api都採用__stdcall調用方式,這樣的宏定義說明了問題:

#define WINAPI __stdcall

按C編譯方式,__stdcall調用約定在輸出函數名前面加下劃線,後面加“@”符號和參數的字節數,形如_functionname@number。

(2) __cdecl調用
__cdecl是C/C++的缺省調用方式,參數採用從右到左的壓棧方式,傳送參數的內存棧由調用者維護。__cedcl約定的函數只能被C/C++調用,每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。

由於__cdecl調用方式的參數內存棧由調用者維護,所以變長參數的函數能(也只能)使用這種調用約定

由於Visual C++默認採用__cdecl 調用方式,所以VC中中調用DLL時,用戶應使用__stdcall調用約定。
按C編譯方式,__cdecl調用約定僅在輸出函數名前面加下劃線,形如_functionname。

(3) __fastcall調用
__fastcall調用較快,它通過CPU內部寄存器傳遞參數。

  按C編譯方式,__fastcall調用約定在輸出函數名前面加“@”符號,後面加“@”符號和參數的字節數,形如@functionname@number。

 

 (4)結論,如果你的程序中沒有涉及可變參數,最好使用__stdcall關鍵字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章