__stdcal,_cdecl和__fastcall

  最近學習過程中碰到有關函數調用方法,如:__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。

 

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 7661
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章