__fastcall
Microsoft 固有の仕様 →
__fastcall 呼び出し規約は、可能な場合に、関数への引数をレジスタに渡すことを指定します。 この呼び出し規約は x86 アーキテクチャのみに適用されます。 次の一覧は、この呼び出し規約の実装例を示しています。
要素 |
実装 |
---|---|
引数を渡す順序 |
左から右への引数リストで見つかる最初の 2 つの DWORD またはこれより小さい引数は、ECX および EDX レジスタに渡されます。他の引数はすべてスタック上で右から左へ渡されます。 |
スタック メンテナンスの役割 |
呼び出された関数によって、スタックから引数がポップされます。 |
名前装飾規約 |
アット マーク (@) が名前の先頭に付きます。パラメーター リストでバイト数 (10 進数) が後続するアット マークは、名前にサフィックスとして付けられます。 |
大文字と小文字の変換規約 |
大文字小文字は変換されません。 |
注意
将来のコンパイラ バージョンは、パラメーターを格納するために別のレジスタを使用する可能性があります。
/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; }
使用例
次の例では、関数 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, ...);