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