
C++调用约定详解:stdcall, cdecl,fastcall与thiscall
下载需积分: 10 | 81KB |
更新于2024-07-26
| 175 浏览量 | 举报
收藏
C++中的函数调用约定主要有四种形式:\_\_stdcall、\_\_cdecl、\_\_fastcall 和 thiscall,每种约定对参数传递、堆栈管理以及性能影响都有所不同。
1. \_\_stdcall (标准C语言调用):
- 这是Pascal程序的默认调用方式,常用于Windows API中。
- 参数采用从右至左的压栈方式。
- 函数退出时自行清理堆栈,但调用者负责维护内存栈。
- VC编译器会在函数名前添加下划线前缀,并根据参数字节数追加后缀。
- 缺省调用约定,可能使可执行文件较大。
2. \_\_cdecl (常规C/C++调用):
- C和C++程序的默认调用方式。
- 也是按从右至左压栈参数。
- 调用者负责清理堆栈,包括管理内存。
- 常用于支持可变参数函数。
- 函数名前有下划线前缀。
3. \_\_fastcall (快速调用):
- 注重速度,通过寄存器传递前两个双字参数,其余压栈。
- 快速,但不适用于所有参数类型。
- 调用者在函数返回前清理寄存器使用的内存。
- 函数名前缀是"@",后跟参数字节数。
4. thiscall (内联成员函数调用):
- 专用于C++中的成员函数,特别是类实例。
- this指针存储在CX寄存器,参数从右向左压栈。
- 不是关键字,不能被程序员直接指定,仅在类方法中使用。
5. nakedcall (裸调用):
- 非常规调用方式,当使用其他约定时需要额外处理特定寄存器。
- 编译器不会自动保存或恢复ESI、EDI、EBX和EBP寄存器。
- 需要与\_declspec一起使用,以避免编译器插入额外的代码。
了解这些调用约定有助于编写高效的C++代码,特别是在处理性能敏感的场景和不同库之间的交互时。选择合适的调用约定能优化代码大小、提高执行效率,并确保与其他API或库的兼容性。在实际编程中,开发者应根据项目需求和特定平台的要求来选择最合适的调用约定。
相关推荐










李奥纳多
- 粉丝: 0
最新资源
- C#客户端请求程序:实现网络交互对话
- 数字语音朗读:从0到9的音频文件制作指南
- DIV+CSS设计的四种漂亮网页导航条范例
- GIS空间分析:原理、算法与应用
- 探索VC开发的类似QQ聊天软件源码
- 基于PROTEUS的16x64LED点阵移动显示设计
- 全面掌握组网技术与配置指南
- J2ME纵版飞机游戏子弹碰撞与滚屏技术实现
- 掌握UCOSII文件系统源码:深入研究与开发
- LabVIEW XML-RPC:7.1至8.5版本特性解析
- C语言程序设计教程:Visual C++ 6.0环境实例解析
- QT象棋程序开发:配置与引擎初始化
- MTK手机专用META通用解锁工具使用教程
- 掌握Windows多线程编程:郝文化经典源代码解析
- ASP.NET+C#+Flash实现多样化统计图表源码详解
- 掌握Spring AOP:开发声明式事务管理小程序
- Java桌面学生信息管理系统的数据库操作源码解析
- 操作系统课程实验资料大全
- 模拟UNIX文件系统:完整运行环境与设计文档
- MTK BIN文件图片和铃声提取工具
- J2ME平台上用JAVA编写的简易贪食蛇游戏
- PC端生成任意波形并通过串口控制单片机输出
- ASP.NET+C#网页图片浏览器控件的实现与应用示例
- 搜狗拼音输入法:高效中文打字技巧