call conventions

本文详细介绍了函数调用约定的概念及其在不同编程环境中的应用,包括cdecl、stdcall、fastcall和thiscall,探讨了它们在参数传递、返回值处理和栈管理方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

call conventions 是在调用函数时要遵守的一系列的约定,包括怎样传参数,怎样返回值,怎样管理栈及帧指针等。主流的约定有三种:stdcall,cdecl,fastcall。c++中的thiscall。

1.cdecl

  • c语言的默认调用约定
  • 参数用栈,以从右到左传递,返回值用eax来传递。
  • 调用者负责清理堆栈,这使得cdecl支持可变参数,同时也不会把参数的数目附加到函数名后面,汇编器和连接器便不能确定参数的数目

2.stdcall

  • Win32 API的调用约定,因为stdcall被Microsoft严格的定义,所以所有编译器的实现方式相同。
  • 参数从右到左传递,返回值在eax中。
  • 被调用者负责清理堆栈,因此stdcall不支持变长参数,但是在函数名后面会附加参数的字节数。

3.fastcall

  • 前2个或3个 32-bit(或更小)的参数用寄存器来传递,经常使用edx,ecx,eax,其他的参数或大于4 Byte的参数用栈来传递,通常也是按从右到左方向传递。
  • 如果使用了堆栈的话,通常是调用函数负责清理堆栈。
  • 建议只有参数是1到3个32bit的参数,并且对速度要求较高的情景下使用。

4.thiscall

  • 指向类的指针用ecx来传递,参数按从右向左压入堆栈,返回值在eax中。
上述的调用约定是针对32位机器的,64位的会有变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值