首页 > 后端开发 > C++ > 正文

C++ 函数调用约定的历史演变和发展趋势

王林
发布: 2024-09-01 11:42:03
原创
310人浏览过

c++++ 函数调用约定随着平台和技术的演进而发展,从 __cdecl 到 __fastcall,再到 __thiscall 和 __vectorcall。现代编译器使用 x64 调用约定,它使用寄存器和栈根据参数大小传递参数,并由调用者负责清理栈。选择函数调用约定时,应考虑性能影响,根据函数规模和参数数量确定最合适的约定。

C++ 函数调用约定的历史演变和发展趋势

C++ 函数调用约定的历史演变和发展趋势

C++ 语言中函数调用约定描述了函数参数是如何在调用时在栈上传递的。不同的调用约定适用于不同的系统和平台,以优化性能和兼容性。

演变历史

立即学习C++免费学习笔记(深入)”;

  • cdecl (Windows):参数从右至左压栈,最右边的参数最先压栈。函数返回时,从栈中弹出参数。
  • stdcall (Windows):类似于 __cdecl,但调用者负责清理栈。
  • fastcall (Windows):前两个参数放在 registers 中作为隐藏参数传递,其余参数压栈。
  • thiscall (C++):第一个参数始终是隐式 this 指针,调用者负责清理栈。
  • __vectorcall (x86-64__):使用 SIMD 寄存器传递四个或更多参数,从而提高性能。

发展趋势

现代编译器倾向于使用 x64 调用约定,因为它提供更高的性能和效率。x64 调用约定如下:

  • 整数和浮点参数使用寄存器传递。
  • 大于 16 字节的参数在栈上按需分配。
  • 调用者负责清理栈。

实战案例

考虑以下 C++ 代码:

可图大模型
可图大模型

可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型

可图大模型 110
查看详情 可图大模型
void add(int a, int b, int c) {
  int sum = a + b + c;
  // ...
}
登录后复制

以下为使用不同调用约定的代码示例:

__cdecl

int main() {
  add(1, 2, 3);
  return 0;
}
登录后复制

__stdcall

int main() {
  __stdcall add(1, 2, 3);
  return 0;
}
登录后复制

x64

编译器将自动使用 x64 调用约定。

性能考虑

选择函数调用约定时,需要考虑性能影响。以下是一些准则:

  • 对于经常调用的小型函数,x64 可能是最佳选择。
  • 对于参数较多的大型函数,__stdcall 可能效率更高。

通过了解函数调用约定,开发者可以优化代码性能并确保跨平台兼容性。

以上就是C++ 函数调用约定的历史演变和发展趋势的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号