__cdecl __fastcall與__stdcall,三者都是調用約定(Calling convention),它決定以下內容:1)函數參數的壓棧順序,2)由調用者還是被調用者把參數彈出棧,3)以及產生函數修飾名的方法。
1、__stdcall調用約定:函數的參數自右向左通過棧傳遞,被調用的函數在返回前清理傳送參數的內存棧。
2、_cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數採用從右到左的壓棧方式。注意:對於可變參數的成員函數,始終使用__cdecl的轉換方式。
3、__fastcall調用約定:它是通過寄存器來傳送參數的(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧)。
4、thiscall僅僅應用於"C++"成員函數。this指針存放於CX寄存器,參數從右到左壓。thiscall不是關鍵詞,因此不能被程序員指定。
5、nakedcall採用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked call不產生這樣的代碼。naked call不是類型修飾符,故必須和_declspec共同使用。
__cdecl __fastcall與__stdcall的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
NetBeans運行error: bin/nativeexecution/Linux-x86_64/pty
Juffi
2018-08-27 19:54:17
my leetcode#1 #2 #3 #4 #6 #7 #8
Juffi
2018-08-27 19:54:16
my leetcode#13 #14
Juffi
2018-08-27 19:54:15
移植unbuntu Qt項目到 windows 下(包含socket)
Juffi
2018-08-27 19:54:15
學習C++通過使用MinGW+Eclipse(windows下)
暴烈骑士
2018-08-27 19:49:19
虛函數表
fengjingchao8
2018-08-27 19:48:48
C++中int main(int argc, char *argv[])解釋
YuFF
2018-08-27 19:45:47
C++中函數的參數傳遞
YuFF
2018-08-27 19:45:43
直接插入排序、shell 排序、快速排序C++實現
FANG___
2018-08-27 19:42:41
二叉樹的前中後序的遞歸、非遞歸遍歷
FANG___
2018-08-27 19:42:38
(C++) 踩了幾個坑
FANG___
2018-08-27 19:42:38
個人覺得C++BuilderX是個失敗的作品
elever
2018-08-27 19:41:36
CloseHandle(),TerminateThread(),ExitThread()的區別
侠隐仙踪
2018-08-27 19:34:57
拷貝某個文件夾下的所有文件到指定文件夾
侠隐仙踪
2018-08-27 19:34:57