_stdcall和_cdecl

关于_stdcall和_cdecl
参考网址:
https://blog.csdn.net/myjisgreat/article/details/46477769
https://bbs.csdn.net/topics/390435293?page=1#post-394308806
https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions?view=vs-2019
 

  • _stdcall和_cdecl,这两种方式的区别为调用后谁来恢复栈数据。

即:
_stdcall为被调用者恢复栈上数据
_cdecl为调用者恢复栈上数据

  • 空间方面

_cdecl为调用者恢复栈上数据,假设有一百个不同的函数调用函数a,那么内存中就有一个段恢复堆栈的代码。
_stdcall为被调用者恢复栈,只有在函数代码的结尾出现一次恢复堆栈代码,所以节约空间。
注意,这些恢复堆栈的代码是编译器根据你给他的call方式自动生成的,所以你无需考虑…而告诉编译器call方式的意义就在这里,如果一方用cdecl一方用stdcall可能出现没有人释放堆栈的情况,这明显是不允许的 

_cdecl为被调用函数返回后,由调用者恢复堆栈
_stdcall为被调用函数返回前由被调用函数自己恢复堆栈

  • 函数变参方面

_cdecl的优势在于他可以不定参数个数,参考printf函数。原因在于是调用者存入参数,调用者释放参数占有的空间,都是调用者完成的,所以有参数个数的自由性
_stdcall在结束函数时,恢复的空间是编译时决定的,函数负责释放,但他无法知道你实际压入几个参数,于是stdcall在编译时就规定了参数个数,无法实现不定个数的参数调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值