以前做 Function 的時候恰好取巧避免掉了,這些天在做 Bind,不得已要把每個調用約定羅列一遍。順手把這些東西復習一下,總結如下——
(所有內容針對 VC 編譯平臺)
一、x86
名稱 | 傳參方式 | 棧清理 | C 語言函數(shù)重命名(例:int func(int, double)) |
__cdecl | 從右至左壓棧 | 主調函數(shù) | 前面加“_”(_func) |
__stdcall | 從右至左壓棧 | 被調函數(shù) | 前面加“_”,后面加“@”再加參數(shù)十進制字節(jié)數(shù)(_func@12) |
__fastcall | 前兩個不大于DWORD長度的參數(shù)從左至右分別存到 ECX、EDX,其余從右至左壓棧 | 被調函數(shù) | 前面加“@”,后面加“@”再加參數(shù)十進制字節(jié)數(shù)(@func@12) |
__thiscall | ECX 存 this,其余從右至左壓棧 | 被調函數(shù) | 僅用于 C++ |
二、x64
名稱 | 傳參方式 | 棧清理 | |
__fastcall | 前四個整數(shù)/浮點數(shù)放在 RCX/XMM0、RDX/XMM1、R8/XMM2、R9/XMM3,其余壓棧。 如果前 4 個參數(shù)分別為 int、float、long、double,它們將分別被存到 RCX、XMM1、R8、XMM3 | 被調函數(shù) | |
64位編譯環(huán)境下,可以指定 __cdecl、__stdcall、__fastcall,但是編譯器會忽略它們。兩個顯示指定了不同調用約定的函數(shù)不構成重載,而構成重定義錯誤。
posted on 2012-05-12 01:36
溪流 閱讀(555)
評論(0) 編輯 收藏 引用 所屬分類:
C++ 、
Windows