首页 > 后端开发 > C++ > 调用约定如何影响 C/C 中函数参数的传递?

调用约定如何影响 C/C 中函数参数的传递?

DDD
发布: 2024-11-12 07:34:02
原创
1023 人浏览过

How Do Calling Conventions Shape Function Argument Passing in C/C  ?

了解 C/C 中的调用约定

调用约定定义函数如何传递和接收参数及其值。 C/C 提供了多种调用约定,每种调用约定都有特定的用途。

调用约定的数量

C/C 中提供了多种调用约定,包括:

  • cdecl
  • syscall
  • pascal
  • stdcall
  • fastcall
  • vectorcall
  • safecall
  • Microsoft X64 调用约定

每个约定的含义

cdecl:

  • 在堆栈上传递的参数。
  • 寄存器被指定用于特定目的(EAX 用于返回值,EAX、ECX、EDX 用于调用者保存)。

syscall:

  • 与 cdecl 类似,但不保留特定寄存器。

pascal:

  • 按从左到右的顺序在堆栈上传递的参数。
  • 负责堆栈清理的被调用者。

stdcall:

  • 被调用者清理堆栈。
  • 参数按从右到左的顺序压入,如 cdecl。
  • 指定供内部函数使用的寄存器(EAX、ECX、EDX)。

fastcall:

  • 在寄存器中传递的前两个参数(ECX 和 EDX)。
  • 剩余参数从右到右压入堆栈左。

向量调用:

  • 支持使用 SIMD 寄存器传递向量参数。
  • 最多为向量参数分配 6 个寄存器.

safecall (Delphi/Free Pascal):

  • 封装 COM 错误处理。
  • 在 EAX 中作为异常返回HRESULT,而结果通过引用传递。

Microsoft X64 调用约定:

  • 用于 Windows 和预启动 UEFI。
  • 在寄存器中传递的前四个整数/指针参数(RCX、RDX、R8、R9)。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板