__fastcall
Specyficzne dla firmy Microsoft
Konwencja __fastcall
wywoływania określa, że argumenty funkcji mają być przekazywane w rejestrach, gdy jest to możliwe. Ta konwencja wywoływania dotyczy tylko architektury x86. Na poniższej liście przedstawiono implementację niniejszej konwencji wywoływania.
Element | Implementacja |
---|---|
Kolejność przekazywania argumentów | Pierwsze dwa DWORD lub mniejsze argumenty znajdujące się na liście argumentów od lewej do prawej są przekazywane w rejestrach ECX i EDX; wszystkie inne argumenty są przekazywane na stos od prawej do lewej. |
Odpowiedzialność za utrzymanie stosu | Wywołana funkcja wyskakuje argumenty ze stosu. |
Konwencja dekorowania nazw | Pod znakiem (@) ma prefiks nazwy; znak na znak, po którym następuje liczba bajtów (w przecinku) na liście parametrów jest sufiksem nazw. |
Konwencja translacji wielkości liter | Translacja wielkości liter nie jest wykonywana. |
Klasy, struktury i związki | Traktowane jako typy "wielobajtowe" (niezależnie od rozmiaru) i przekazywane na stosie. |
Wyliczenia i klasy wyliczenia | Przekazane przez rejestrację, jeśli ich typ bazowy jest przekazywany przez rejestr. Na przykład jeśli typ bazowy ma int rozmiar unsigned int 8, 16 lub 32 bity. |
Uwaga
Przyszłe wersje kompilatora mogą używać różnych rejestrów do przechowywania parametrów.
Użycie /Gr opcji kompilatora powoduje, że każda funkcja w module jest kompilowana jako__fastcall
, chyba że funkcja jest zadeklarowana przy użyciu atrybutu powodującego konflikt lub nazwa funkcji to main
.
Słowo __fastcall
kluczowe jest akceptowane i ignorowane przez kompilatory przeznaczone dla architektur ARM i x64; na chipie x64 zgodnie z konwencją pierwsze cztery argumenty są przekazywane w rejestrach, gdy to możliwe, a dodatkowe argumenty są przekazywane na stos. Aby uzyskać więcej informacji, zobacz x64 Calling Convention (Konwencja wywoływania x64). Na mikroukładie ARM do czterech argumentów całkowitych i ośmiu argumentów zmiennoprzecinkowych można przekazać w rejestrach, a dodatkowe argumenty są przekazywane na stosie.
W przypadku funkcji niestatycznych, jeśli funkcja jest zdefiniowana poza wierszem, modyfikator konwencji wywołującej nie musi być określony w definicji pozawierszowej. Oznacza to, że dla metod niestatycznej składowej klasy przyjmowana jest konwencja wywoływania określona podczas deklaracji w punkcie definicji. Biorąc pod uwagę tę definicję klasy:
struct CMyClass {
void __fastcall mymethod();
};
to:
void CMyClass::mymethod() { return; }
jest równoważne temu:
void __fastcall CMyClass::mymethod() { return; }
Aby uzyskać zgodność z poprzednimi wersjami, jest synonimem, _fastcall
__fastcall
chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).
Przykład
W poniższym przykładzie funkcja DeleteAggrWrapper
jest przekazywana argumenty w rejestrach:
// 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 Specific
Zobacz też
Przekazywanie argumentów i konwencje nazewnictwa
Słowa kluczowe
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla