? 最近學(xué)習(xí)過(guò)程中碰到有關(guān)函數(shù)調(diào)用方法,如:__stdcal,_cdecl和__fastcall。查閱了一些相關(guān)的資料和別人的經(jīng)驗(yàn),我總結(jié)如下:
__stdcal,_cdecl,__fastcall有三個(gè)方面來(lái)區(qū)分:
1:函數(shù)參數(shù)是按什么順序壓入棧中的。
2:調(diào)用完畢后是由誰(shuí)來(lái)釋放棧中的空間的。(這個(gè)問(wèn)題主要是因?yàn)楹瘮?shù)傳遞過(guò)程中是存放在棧中的,可以選擇調(diào)用者釋放空間,也可以選擇被調(diào)用者釋放。)
3:產(chǎn)生函數(shù)名的修飾方法。
???????????????????????????????????????????????????
?__stdcal
?_cdecl
?__fastcall
?
1
?從右到左
?從右到左
?一般指?jìng)魉筒怀^(guò)4個(gè)字節(jié)的參數(shù),通過(guò)寄存器,不用棧,這樣比較快
?
2
?函數(shù)自己解決棧的清除工作,如Windows的API函數(shù)
?棧的清除工作是由調(diào)用者(不同的編譯器產(chǎn)生棧的方式不盡相同)
?從左邊開(kāi)始的兩個(gè)大小不大于4個(gè)字節(jié)(DWORD)的參數(shù)分別放在ECX和EDX寄存 器,其余的參數(shù)仍舊自右向左壓棧傳送
?
3
?_func@12
??func@@ZAXXZ
?@func@12
?
為了避免由編譯器造成的問(wèn)題,強(qiáng)烈建議在調(diào)用時(shí)使用__stdcal。
?