免费发布信息
微信公众号

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

   来源:黔优网责任编辑:优优  时间:2024-09-20 17:06:29 浏览量:0

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

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

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

演变历史

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

cdecl (Windows):参数从右至左压栈,最右边的参数最先压栈。函数返回时,从栈中弹出参数。

stdcall (Windows):类似于 __cdecl,但调用者负责清理栈。

fastcall (Windows):前两个参数放在 registers 中作为隐藏参数传递,其余参数压栈。

thiscall (C++):第一个参数始终是隐式 this 指针,调用者负责清理栈。

__vectorcall (x86-64__):使用 SIMD 寄存器传递四个或更多参数,从而提高性能。

发展趋势

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

整数和浮点参数使用寄存器传递。

大于 16 字节的参数在栈上按需分配。

调用者负责清理栈。

实战案例

考虑以下 C++ 代码:

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++ 函数调用约定的历史演变和发展趋势的详细内容,更多请关注本网内其它相关文章!

 
 
 
没用 0举报 收藏 0
免责声明:
黔优网以上展示内容来源于用户自主上传、合作媒体、企业机构或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表黔优网官方立场,请读者仅做参考。本文标题:C++ 函数调用约定的历史演变和发展趋势,本文链接:https://www.qianu.com/help/44253.html,欢迎转载,转载时请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何违法信息,请您立即点此【投诉举报】并提供有效线索,也可以通过邮件(邮箱号:kefu@qianu.com)联系我们及时修正或删除。
 
 

 

 
推荐图文
推荐帮助中心
最新帮助中心