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