__fastcall
Microsoft 专用
__fastcall
调用约定指定尽可能在寄存器中传递函数的自变量。 此调用约定仅适用于 x86 体系结构。 以下列表显示此调用约定的实现。
元素 | 实现 |
---|---|
参数传递顺序 | 在自变量列表中按从左到右的顺序找到的前两个 DWORD 或更小自变量将在 ECX 和 EDX 寄存器中传递;所有其他自变量在堆栈上从右向左传递。 |
堆栈维护职责 | 已调用函数会弹出显示堆栈中的参数。 |
名称修饰约定 | At 符号 (@) 是名称的前缀;参数列表中的字节数(在十进制中)前面的 at 符号是名称的后缀。 |
大小写转换约定 | 不执行任何大小写转换。 |
类、结构和并集 | 被视为“多字节”类型(无论大小)并在堆栈上传递。 |
枚举和枚举类 | 如果它们的基础类型是通过寄存器传递的,则通过寄存器传递。 例如,如果基础类型是大小为 8、16 或 32 位的 int 或 unsigned int 。 |
注意
将来版本的编译器可使用其他寄存器来存储参数。
使用 /Gr 编译器选项会导致将模块中的每个函数编译为 __fastcall
,除非使用冲突特性来声明函数,或者函数的名称为 main
。
__fastcall
关键字由面向 ARM 和 x64 体系结构的编译器接受和忽略;在 x64 芯片上,按照约定,前四个参数在寄存器中传递(如果可能),而其他参数在堆栈上传递。 有关详细信息,请参阅 x64 调用约定。 在 ARM 芯片上,寄存器中可以传递最多四个整数参数和八个浮点参数,而其他参数在堆栈上传递。
对于非静态类函数,如果函数是超行定义的,则调用约定修饰符不必在超行定义中指定。 也就是说,对于类非静态成员方法,在定义时假定声明期间指定的调用约定。 给定此类定义:
struct CMyClass {
void __fastcall mymethod();
};
此:
void CMyClass::mymethod() { return; }
等效于此:
void __fastcall CMyClass::mymethod() { return; }
为了与以前的版本兼容,除非指定了编译器选项 /Za(禁用语言扩展),否则 _fastcall
是 __fastcall
的同义词。
示例
在下面的示例中,函数 DeleteAggrWrapper
是寄存器中传递的参数:
// Example of the __fastcall keyword
#define FASTCALL __fastcall
void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
结束 Microsoft 专用