__fastcall

Microsoft 专用

__fastcall 调用约定指定尽可能在寄存器中传递函数的自变量。 此调用约定仅适用于 x86 体系结构。 以下列表显示此调用约定的实现。

元素 实现
参数传递顺序 在自变量列表中按从左到右的顺序找到的前两个 DWORD 或更小自变量将在 ECX 和 EDX 寄存器中传递;所有其他自变量在堆栈上从右向左传递。
堆栈维护职责 已调用函数会弹出显示堆栈中的参数。
名称修饰约定 At 符号 (@) 是名称的前缀;参数列表中的字节数(在十进制中)前面的 at 符号是名称的后缀。
大小写转换约定 不执行任何大小写转换。
类、结构和并集 被视为“多字节”类型(无论大小)并在堆栈上传递。
枚举和枚举类 如果它们的基础类型是通过寄存器传递的,则通过寄存器传递。 例如,如果基础类型是大小为 8、16 或 32 位的 intunsigned 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 专用

另请参阅

自变量传递和命名约定
关键字