• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我是张洪铭我是熊博士
时光静好,与君同;细水长流,与君语
博客园    首页    新随笔    联系   管理    订阅  订阅

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

 

posted @ 2017-09-18 09:58  我是张洪铭我是熊博士  阅读(511)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3