首页  >  文章  >  后端开发  >  C/C 中的不同调用约定如何影响函数执行?

C/C 中的不同调用约定如何影响函数执行?

Patricia Arquette
Patricia Arquette原创
2024-11-12 05:31:02757浏览

How do Different Calling Conventions in C/C   Impact Function Execution?

理解 C/C 中的调用约定

在 C/C 中,各种调用约定定义了传递参数、返回值和调用函数时清理堆栈。这些约定包括 stdcall、extern、pascal 和其他几个。

可用的调用约定

C/C 中有许多可用的调用约定:

  • cdecl: 参数压入堆栈从右到左,由调用者处理堆栈平衡。
  • syscall: 与 cdecl 类似,但不保留 EAX、ECX 和 EDX 寄存器。
  • pascal: 参数从左到右压入堆栈,调用者负责堆栈cleanup.
  • stdcall: 调用者从右到左推送参数,被调用者出于特定目的清理函数中使用的堆栈、EAX、ECX 和 EDX。
  • fastcall: 前两个参数通过 ECX 和 EDX 寄存器传递,其余参数从从右到左。
  • vectorcall: 使用 SIMD 寄存器传递向量参数,处理向量类型和 HVA 值。
  • safecall: 封装COM 错误处理,在 EAX 中传递异常,并通过引用传递结果堆栈。
  • Microsoft X64 调用约定: 在特定寄存器中传递的整数参数、在 XMM 寄存器中传递的浮点参数、为溢出分配的影子空间。

不同约定的含义

每个调用约定都有其优点和缺点。例如,stdcall 简化了调用者的职责,而 fastcall 通过减少堆栈操作来提高性能。调用约定的选择可能取决于操作系统、处理器架构和编码风格偏好等因素。

其他资源

  • [维基百科:C调用约定](https://en.wikipedia.org/wiki/Calling_convention#C)
  • [致电您的功能! (x86 调用约定)](https://www.agner.org/optimize/calling_conventions.pdf)
  • [MSDN:Arm64 的调用约定(AArch64)](https://docs.microsoft.com/en-us/cpp/build/arm64-abi-for-visual-studio?view=vs-2022)

以上是C/C 中的不同调用约定如何影响函数执行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn