跳转至

调用约定

英文: Calling convention.
别名: 调用方法, 调用规则.

调用约定 入栈顺序 清栈责任
cdecl 从右到左 调用者
stdcall 从右到左 被调用者
fastcall RDX, RCX, 从右到左 被调用者
thiscall RCX, 从右到左 被调用者
pascal 从左到右 被调用者
Microsoft x64 RDX (XMM0), RCX (XMM1), R8 (XMM2), R9 (XMM3), 从右到左 调用者

cdecl

为 C Declaration 的缩写, 是 C/C++ 的默认调用约定, 可变参数函数只能使用该调用约定.

stdcall

为 Standard Call 的缩写, Win API 只使用该调用约定和 vectorcall.

thiscall

是 C++ 非静态成员函数的默认调用约定.
通常, this 使用寄存器 RCX 传递.

fastcall

部分参数利用寄存器传参, 以提高函数调用的效率.
通常, 左侧两个参数使用寄存器 RDX, RCX 传递.

pascal

是 Pascal/Delphi 所使用的调用约定.

Microsoft x64

前 4 个参数根据类型 (整数或浮点数) 使用寄存器传递. 其余参数从右往左依次入栈.

  • 整数使用寄存器: RDX, RCX, R8, R9.
  • 浮点数使用寄存器: XMM0, XMM1, XMM2, XMM3.

在 Windows 环境下针对 x64 架构进行编译时, stdcall/thiscall/cdecl/fastcall 均解析为使用此约定.

评论