调用约定
英文: 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
均解析为使用此约定.