__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