__fastcall
Microsoft 固有の仕様
__fastcall
呼び出し規則は、可能な場合に、関数への引数をレジスタに渡すことを指定します。 この呼び出し規則は x86 アーキテクチャのみに適用されます。 次の一覧は、この呼び出し規約の実装例を示しています。
要素 | 実装 |
---|---|
引数を渡す順序 | 引数リストで左から右に見つかった最初の 2 つ DWORD 以下の引数は ECX レジスタと EDX レジスタで渡されます。その他のすべての引数は、スタック上で右から左に渡されます。 |
スタック メンテナンスの役割 | 呼び出された関数によって、スタックから引数がポップされます。 |
名前装飾規約 | アット マーク (@) には名前のプレフィックスが付いています。at 記号の後にパラメーター リストのバイト数 (10 進数) が付いた名前が付きます。 |
大文字と小文字の変換規約 | 大文字小文字は変換されません。 |
クラス、構造体、および共用体 | (サイズに関係なく) "マルチバイト" 型として扱われ、スタックで渡されます。 |
列挙型と列挙型クラス | 基になる型がレジスタによって渡される場合、レジスタによって渡されます。 たとえば、基になる型がint unsigned 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 固有の仕様はここまで
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示