Microsoft 固有の仕様Microsoft Specific

_ _Fastcall呼び出し規約は、関数の引数には、可能であればレジスタで渡されることを指定します。The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible. この呼び出し規則は x86 アーキテクチャのみに適用されます。This calling convention only applies to the x86 architecture. 次の一覧は、この呼び出し規則の実装例を示しています。The following list shows the implementation of this calling convention.

要素Element 実装Implementation
引数を渡す順序Argument-passing order 左から右への引数リストで見つかる最初の 2 つの DWORD またはこれより小さい引数は、ECX および EDX レジスタに渡されます。他の引数はすべてスタック上で右から左へ渡されます。The first two DWORD or smaller arguments that are found in the argument list from left to right are passed in ECX and EDX registers; all other arguments are passed on the stack from right to left.
スタック メンテナンスの役割Stack-maintenance responsibility 呼び出された関数によって、スタックから引数がポップされます。Called function pops the arguments from the stack.
名前装飾規約Name-decoration convention アット マーク (@) 名をプレフィックスとしては、記号の後に、パラメーターの (10 進数) のバイト数で一覧の名前にサフィックスが。At sign (@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names.
大文字と小文字の変換規約Case-translation convention 大文字小文字は変換されません。No case translation performed.


将来のコンパイラ バージョンは、パラメーターを格納するために別のレジスタを使用する可能性があります。Future compiler versions may use different registers to store parameters.

使用して、 /Grコンパイラ オプションでは、各関数を原因としてコンパイルするモジュールで _ _fastcall 、競合する属性を使用して、関数が宣言されているか、関数の名前は、しない限り、 main.Using the /Gr compiler option causes each function in the module to compile as __fastcall unless the function is declared by using a conflicting attribute, or the name of the function is main.

_ _Fastcallキーワードが受け入れられるし、ARM および x64 を対象とするコンパイラでは無視されますアーキテクチャ、x64 チップや規則により、最初の 4 つの引数が可能であれば、レジスタで渡される追加の引数が渡されますスタック。The __fastcall keyword is accepted and ignored by the compilers that target ARM and x64 architectures; on an x64 chip, by convention, the first four arguments are passed in registers when possible, and additional arguments are passed on the stack. 詳細については、次を参照してください。 x64 呼び出し規則します。For more information, see x64 Calling Convention. ARM チップでは、最大で 4 個の整数引数と 8 個の浮動小数点引数をレジスタに渡すことができます。追加の引数はスタック上に渡されます。On an ARM chip, up to four integer arguments and eight floating-point arguments may be passed in registers, and additional arguments are passed on the stack.

静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規則の修飾子を指定する必要はありません。For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規則が定義の時点で仮定されます。That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. 次のクラス定義があるとします。Given this class definition:

struct CMyClass {
   void __fastcall mymethod();


void CMyClass::mymethod() { return; }

は次の記述と同じです。is equivalent to this:

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

以前のバージョンとの互換性のため _fastcallのシノニムです _ _fastcallしない限り、コンパイラ オプション/Za(言語拡張機能を無効にする)は指定します。For compatibility with previous versions, _fastcall is a synonym for __fastcall unless compiler option /Za (Disable language extensions) is specified.


次の例では、関数 DeleteAggrWrapper にレジスタで引数が渡されます。In the following example, the function DeleteAggrWrapper is passed arguments in registers:

// 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 固有の仕様はここまでEND Microsoft Specific

関連項目See also

引数の渡し規則と名前付け規則Argument Passing and Naming Conventions