Share via


__fastcall

Microsoft 特定的

呼叫 __fastcall 慣例會指定要盡可能在暫存器中傳遞函式的引數。 這個呼叫慣例僅適用於 x86 架構。 下列清單會顯示這個呼叫慣例的實作。

元素 實作
引數傳遞順序 從左至右的引數清單中找到的前兩個 DWORD 或較小的引數會傳入 ECX 和 EDX 暫存器;所有其他引數都會從右至左傳遞至堆疊。
堆疊維護責任 所呼叫的函式會從堆疊取出引數。
名稱裝飾慣例 在符號 (@) 前面加上名稱;在 符號後面接著參數清單中的位元組數(以十進位為單位)會後綴為名稱。
大小寫轉譯慣例 未執行大小寫轉譯。
類別、結構及等位 視為「多位元組」類型(不論大小為何),並傳遞在堆疊上。
列舉和列舉類別 如果其基礎類型是透過 register 傳遞,則由 register 傳遞。 例如,如果基礎類型是 intunsigned int 大小為 8、16 或 32 位,則為 。

注意

未來的編譯器版本可能會使用不同的暫存器來儲存參數。

使用 /Gr 編譯器選項會導致模組中的每個函式編譯為 __fastcall ,除非函式是使用衝突的屬性來宣告,否則函式的名稱為 main

__fastcall ARM 和 x64 架構為目標的編譯器會接受並忽略 關鍵字;根據慣例,前四個引數會盡可能傳入暫存器,並在堆疊上傳遞其他引數。 如需詳細資訊,請參閱 x64 呼叫慣例 。 在 ARM 晶片上,最多可以在暫存器中傳遞四個整數引數和八個浮點引數,而其他引數則是在堆疊上傳遞。

針對非靜態類別函式,如果函式是非連續定義,則呼叫慣例修飾詞不需要在外行定義上指定。 也就是說,對於類別非靜態成員方法而言,宣告時所指定的呼叫慣例是在定義時假設。 如果已指定此類別定義:

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, ...);

END Microsoft 特定的

另請參閱

引數傳遞和命名慣例
關鍵字