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