C++调用约定详解:stdcall, cdecl,fastcall与thiscall
需积分: 10 29 浏览量
更新于2024-07-26
收藏 81KB DOC 举报
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或库的兼容性。在实际编程中,开发者应根据项目需求和特定平台的要求来选择最合适的调用约定。
2017-10-23 上传
2011-08-24 上传
2018-01-31 上传
2023-08-04 上传
2023-06-01 上传
2024-09-11 上传
2023-05-31 上传
2023-07-28 上传
2023-07-03 上传
李奥纳多
- 粉丝: 0
- 资源: 5
最新资源
- 新型智能电加热器:触摸感应与自动温控技术
- 社区物流信息管理系统的毕业设计实现
- VB门诊管理系统设计与实现(附论文与源代码)
- 剪叉式高空作业平台稳定性研究与创新设计
- DAMA CDGA考试必备:真题模拟及章节重点解析
- TaskExplorer:全新升级的系统监控与任务管理工具
- 新型碎纸机进纸间隙调整技术解析
- 有腿移动机器人动作教学与技术存储介质的研究
- 基于遗传算法优化的RBF神经网络分析工具
- Visual Basic入门教程完整版PDF下载
- 海洋岸滩保洁与垃圾清运服务招标文件公示
- 触摸屏测量仪器与粘度测定方法
- PSO多目标优化问题求解代码详解
- 有机硅组合物及差异剥离纸或膜技术分析
- Win10快速关机技巧:去除关机阻止功能
- 创新打印机设计:速释打印头与压纸辊安装拆卸便捷性