理解 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中文网其他相关文章!