调用惯例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++调用约定。

原文地址:https://www.cnblogs.com/azbane/p/7541678.html