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

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

Barbara Streisand
Barbara Streisand原创
2024-11-20 03:10:02250浏览

How Do Different Calling Conventions Impact C/C   Function Execution?

C/C 中不同的调用约定

C/C 提供了各种调用约定来指定如何处理函数参数和返回值。理解这些约定对于优化代码和确保程序不同部分之间的高效交互至关重要。

可用的调用约定

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

  • cdecl:在堆栈上传递的参数,在寄存器中返回值(整数为 EAX,浮点数为 ST0)
  • syscall:与 cdecl 类似,除了 EAX 、ECX 和 EDX 寄存器不保留
  • pascal:参数从左到右推送,被调用者平衡堆栈
  • stdcall:调用者 -清理stdcall,参数从右向左推送,返回值在EAX
  • fastcall:前两个参数在ECX和EDX中传递,剩余参数在堆栈上
  • vectorcall:用于使用 SIMD 寄存器传递向量参数
  • safecall:封装错误处理,HResults 在 EAX 中返回
  • Microsoft X64 调用约定:用于Windows和UEFI,RAX中64位返回值,RCX-R9中传递64位参数
  • thiscall:与cdecl类似,但this 通过隐藏参数传递的指针

详细解释

cdecl:
在cdecl(按值调用)中,被调用函数承担清理责任返回之前的堆栈。参数从右到左压入堆栈。

pascal:
在 pascal(按值结果调用)中,被调用者负责在返回之前平衡堆栈。返回值也会在堆栈上传回。

stdcall:
在stdcall(按值调用)中,被调用者负责清理堆栈。参数从右到左压入堆栈,而返回值存储在 EAX 寄存器中。

fastcall:
在 fastcall(通过寄存器调用)中,前两个参数在 ECX 和 EDX 寄存器中传递。其余参数从右到左压入堆栈。

**有关其他调用约定的更多详细信息,请参阅以下综合答案:]

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

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