天天看点

_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在编译时就规定了参数个数,无法实现不定个数的参数调用