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