_stdcall,_cdecl,_fastcall 详细说明

本文详细介绍了C/C++中的调用约定,包括_stdcall、_cdecl和_fastcall。_stdcall是Pascal的默认调用方式,参数从右到左压栈,函数自身清理堆栈,常用于Win32 API。_cdecl是C/C++的默认调用方式,调用者负责清理堆栈,适用于变长参数。_fastcall通过寄存器快速传递参数,减少压栈操作。_thiscall仅用于C++成员函数,this指针存放在CX寄存器。不同的调用约定在函数名修饰上也有不同规则。
摘要由CSDN通过智能技术生成
 

(1) _stdcall调用  _stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。  WIN32 Api都采用_stdcall调用方式,这样的宏定义说明了问题:   #define WINAPI _stdcall   按C编译方式,_stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number

(2) _cdecl调用  _cdecl是C/C++的缺省调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护。_cedcl约定的函数只能被C/C++调用,每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。   由于_cdecl调用方式的参数内存栈由调用者维护,所以变长参数的函数能(也只能)使用这种调用约定。  由于Visual C++默认采用_cdecl 调用方式,所以VC中中调用DLL时,用户应使用_stdcall调用约定。  按C编译方式,_cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。   

(3) _fastcall调用  _fastcall调用较快,它通过CPU内部寄存器传递参数。 (实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),  按C编译方式,_fastcall调用约定在输出函数名前面加“@”符号,后面加“@

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值