调用惯例Calling Convention (或者说:调用约定)
调用惯例影响执行效率,参数的传递方式以及栈清除的方式。
调用惯例 | 参数传递顺序 | 谁负责清除参数 | 参数是否使用暂存器 |
register | 从左到右 | 被调用者 | 是 |
pascal | 从左到右 | 被调用者 | 否 |
cdecl | 从右到左 | 调用者 | 否 |
stdcall | 从右到左 | 被调用者 | 否 |
safecall | 从右到左 | 被调用者 | 否 |
fastcall |
头两个DWORD(4字节)类型或者占更少 字节的参数被放入寄存器,其它剩下的参数 按从右至左的顺序压入栈 |
被调用者 | 否 |
WINAPI |
在WINDEF.H中定义:#define WINAPI _stdcall |
Dekphi 默认的调用惯例是:__register
win32API 默认的调用惯例是:__pascal、__stdcall、__safecall
c语言 默认的调用惯例:__cdecl __stdcall __fastcall
2019/04/15引用百度百科:
函数原型中__stdcall,因为它以双下划线打头,所以它是一个特定于编译器的扩展,说到底也就是微软的实现。任何支持开发基于Win32的程序都必须支持这个扩展或其等价物。以__stdcall标识的函数使用了标准调用约定,为什么叫标准约定呢,因为所有的Win32 API(除了个别接受可变参数的除外)都使用它。标准调用约定的函数在它们返回到调用者之前,都会从堆栈中移除掉参数,这也是Pascal的标准约定。但在C/C++中,调用约定是调用者负责清理堆栈,而不是被调用函数;为强制函数使用C/C++调用约定,可使用__cdecl。另外,可变参数函数也使用C/C++调用约定。