Udostępnij za pośrednictwem


__fastcall

Specyficzne dla firmy Microsoft

Konwencja wywoływania __fastcall określa, że argumenty funkcji są przekazywane do rejestrów, 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 argumenty DWORD lub mniejsze argumenty znalezione na liście argumentów od lewej do prawej są przekazywane w rejestrach ECX i EDX; wszystkie inne argumenty są przekazywane na stosie od prawej do lewej.

Odpowiedzialność za utrzymanie stosu

Wywołana funkcja wyciąga argumenty ze stosu.

Konwencja dekorowania nazw

Znak (@) stanowi prefiks do nazw; za znakiem następuje liczba bajtów (w zapisie dziesiętnym) w parametrze umieszczona jako sufiks do nazw.

Tłumaczenie przypadku konwencji

Nie wykonano żadnego procesu tłumaczenia.

[!UWAGA]

Przyszłe wersje kompilatora mogą używać innych rejestrów do przechowywania parametrów.

Użycie opcji kompilatora /Gr powoduje, że każda funkcja w module jest skompilowana jako __fastcall, chyba że funkcja jest zadeklarowana przez użycie z atrybutem sprzecznych lub nazwą funkcji jest main.

Słowo kluczowe __fastcall jest akceptowane i ignorowane przez kompilatory, które współpracują z architekturami ARM i x64; w przypadku architektury x64 według konwencji pierwsze cztery argumenty są przekazywane do rejestrów, gdy jest to możliwe, a dodatkowe argumenty są przekazywane na stosie.Aby uzyskać więcej informacji, zobacz Omówienie x 64 konwencji wywołania.W układzie ARM maksymalnie cztery liczby całkowitej argumentów i osiem argumentów zmiennoprzecinkowych może być przekazywane w rejestrach, a dodatkowe argumenty są przekazywane na stosie.

W przypadku funkcji niestatycznych klas, jeśli funkcja jest zdefiniowana poza wierszem, modyfikator konwencji wywołania nie musi być określony w definicji poza wierszem.Oznacza to, że dla metod niestatycznego członka klasy przyjmowana jest konwencja wywołania określona podczas zgłoszenia w punkcie definicji.Biorąc pod uwagę tę definicję klasy:

struct CMyClass {
   void __fastcall mymethod();
};

to:

void CMyClass::mymethod() { return; }

jest równoważne do:

void __fastcall CMyClass::mymethod() { return; }

Przykład

W poniższym przykładzie funkcja o nazwie DeleteAggrWrapper jest przekazywana argumentom 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, ...);

Zobacz też

Informacje

Przekazywanie argumentów i konwencje nazewnictwa

Słowa kluczowe języka C++