__fastcall
Microsoft 特定的
呼叫 __fastcall
慣例會指定要盡可能在暫存器中傳遞函式的引數。 這個呼叫慣例僅適用於 x86 架構。 下列清單會顯示這個呼叫慣例的實作。
元素 | 實作 |
---|---|
引數傳遞順序 | 從左至右的引數清單中找到的前兩個 DWORD 或較小的引數會傳入 ECX 和 EDX 暫存器;所有其他引數都會從右至左傳遞至堆疊。 |
堆疊維護責任 | 所呼叫的函式會從堆疊取出引數。 |
名稱裝飾慣例 | 在符號 (@) 前面加上名稱;在 符號後面接著參數清單中的位元組數(以十進位為單位)會後綴為名稱。 |
大小寫轉譯慣例 | 未執行大小寫轉譯。 |
類別、結構及等位 | 視為「多位元組」類型(不論大小為何),並傳遞在堆疊上。 |
列舉和列舉類別 | 如果其基礎類型是透過 register 傳遞,則由 register 傳遞。 例如,如果基礎類型是 int 或 unsigned 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 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應