__fastcall

Microsoft 固有の仕様

__fastcall 呼び出し規則は、可能な場合に、関数への引数をレジスタに渡すことを指定します。 この呼び出し規則は x86 アーキテクチャのみに適用されます。 次の一覧は、この呼び出し規約の実装例を示しています。

要素 実装
引数を渡す順序 引数リストで左から右に見つかった最初の 2 つ DWORD 以下の引数は ECX レジスタと EDX レジスタで渡されます。その他のすべての引数は、スタック上で右から左に渡されます。
スタック メンテナンスの役割 呼び出された関数によって、スタックから引数がポップされます。
名前装飾規約 アット マーク (@) には名前のプレフィックスが付いています。at 記号の後にパラメーター リストのバイト数 (10 進数) が付いた名前が付きます。
大文字と小文字の変換規約 大文字小文字は変換されません。
クラス、構造体、および共用体 (サイズに関係なく) "マルチバイト" 型として扱われ、スタックで渡されます。
列挙型と列挙型クラス 基になる型がレジスタによって渡される場合、レジスタによって渡されます。 たとえば、基になる型がintunsigned intサイズ 8、16、または 32 ビットの場合です。

Note

将来のコンパイラ バージョンは、パラメーターを格納するために別のレジスタを使用する可能性があります。

/Gr コンパイラ オプションを使用すると、関数が競合する属性で宣言されていない場合、または関数の名前が main でない場合は、モジュールの各関数は __fastcall としてコンパイルされます。

__fastcall キーワードは、ARM および x64 アーキテクチャを対象とするコンパイラによって受け取られ、無視されます。x64 チップでは、規約により、可能な場合は最初の 4 つの引数がレジスタに渡され、追加の引数はスタック上に渡されます。 詳細については、「x64 での呼び出し規則」を参照してください。 ARM チップでは、最大で 4 個の整数引数と 8 個の浮動小数点引数をレジスタに渡すことができます。追加の引数はスタック上に渡されます。

非静的クラス関数の場合、関数が行外で定義されている場合、呼び出し規約修飾子を行外定義で指定する必要はありません。 つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規約が定義の時点で仮定されます。 次のクラス定義があるとします。

struct CMyClass {
   void __fastcall mymethod();
};

ここで、

void CMyClass::mymethod() { return; }

は次の記述と同じです。

void __fastcall CMyClass::mymethod() { return; }

以前のバージョンとの互換性を確保するため、_fastcall は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__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 固有の仕様はここまで

関連項目

引数の渡し規則と名前付け規則
キーワード