/Gd, /Gr, /Gv, /Gz (Konwencja wywoływania)
Te opcje określają kolejność, zgodnie z którą argumenty funkcji są wypychane na stos, czy wywołujący funkcję lub wywołana funkcja usuwa argumenty ze stosu na końcu wywołania, oraz konwencję dekorowania nazwy, której kompilator używa do identyfikowania poszczególnych funkcji.
/Gd
/Gr
/Gv
/Gz
Uwagi
Ustawienie domyślne /Gd określa konwencję wywoływania __cdecl dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++ i funkcji oznaczonych jako __stdcall, __fastcall lub __vectorcall.
/Gr określa konwencję wywoływania __fastcall dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, funkcji o nazwie main i funkcji, które są oznaczone jako __cdecl, __stdcall lub __vectorcall.Wszystkie funkcje __fastcall muszą mieć prototypy.Ta konwencja wywołania jest dostępna tylko w kompilatorach, których celem jest x 86, i jest ignorowana przez kompilatory, których celem są inne architektury.
/Gz określa __stdcall konwencję wywoływania dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, funkcji o nazwie maini funkcji, które są oznaczone jako __cdecl, __fastcall lub __vectorcall.Wszystkie funkcje __stdcall muszą mieć prototypy.Ta konwencja wywołania jest dostępna tylko w kompilatorach, których celem jest x 86, i jest ignorowana przez kompilatory, których celem są inne architektury.
/Gv określa konwencję wywoływania __vectorcall dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, nazwanych głównymi, funkcje z lista argumentów zmiennej vararg lub funkcji, które są oznaczone jako sprzeczne z atrybutami __cdecl, __stdcall lub __fastcall.Ta konwencja wywołania jest dostępna tylko na architekturach x 86 i x 64, które obsługują /arch:SSE2 i wyższych, i jest ignorowana przez kompilatory, których celem jest architektura ARM.
Funkcje, które przyjmują zmienną liczbę argumentów, muszą być oznakowane specyfikatorem __cdecl.
/Gd, /Gr, /Gv i /Gz są niezgodne z /clr:safe lub /clr:pure.
[!UWAGA]
Domyślnie dla procesorów x 86 użyj funkcji elementów członkowskich C++ __thiscall.
Dla wszystkich procesorów funkcja członkowska, która jest jawnie oznaczona jako __cdecl, __fastcall, __vectorcall lub __stdcall, używa określonej konwencji wywoływania, jeśli nie jest ona ignorowana na danej architekturze.Funkcja członka, który ma zmienną liczbę argumentów, zawsze używa konwencji wywoływania __cdecl.
Te opcje kompilatora nie mają wpływu na dekorację nazwy metod i funkcji języka C++.O ile nie zostaną zadeklarowane jako extern "C", metody i funkcje C++ używają innego schematu dekorowania nazwy.Aby uzyskać dodatkowe informacje, zobacz Nazwy ozdobione.
Aby uzyskać więcej informacji dotyczących konwencji wywoływania, zobacz Konwencje wywoływania.
Charakterystyka __cdecl
Na procesorach x86 wszystkie argumenty funkcji są przekazywane na stosie od prawej do lewej.W architekturach ARM i x64 niektóre argumenty są przekazywane przez rejestr, a pozostałe są przekazywane na stosie od prawej do lewej.Wywołanie procedury pobiera argumenty ze stosu.
Dla języka C konwencja nazewnictwa __cdecl używa nazwy funkcji poprzedzonej podkreśleniem (_); nie jest wykonywana translacja wielkości liter.O ile nie zostaną zadeklarowane jako extern "C", funkcje C++ używają innego schematu dekorowania nazwy.Aby uzyskać dodatkowe informacje, zobacz Nazwy ozdobione.
Charakterystyka __fastcall
Niektóre z argumentów funkcji __fastcall są przekazywane w rejestrach (dla procesorów x86, ECX i EDX), a pozostałe są wypychane na stos od prawej do lewej.Wywołana procedura wyciąga te argumenty ze stosu przed jego zwracaniem.Zazwyczaj /Gr zmniejsza czas wykonania.
[!UWAGA]
Należy zachować ostrożność, korzystając z konwencji wywoływania __fastcall dla dowolnej funkcji, która jest napisana w języku zestawu.Korzystanie z rejestrów może kolidować z korzystaniem z kompilatora.
Dla języka C konwencja nazewnictwa __fastcall używa nazwy funkcji poprzedzonej znakiem handlowego „po” (@), po której następuje rozmiar argumentów funkcji w bajtach.Nie wykonano żadnego procesu tłumaczenia.Kompilator używa tego szablonu do konwencji nazewnictwa:
@function_name@number
Kiedy używasz konwencji nazewnictwa __fastcall, użyj standardowych plików dołączeń.W przeciwnym wypadku otrzymasz nierozpoznawane odwołania zewnętrzne.
Charakterystyka __stdcall
Argumenty funkcji __stdcall są wypychane na stosie od prawej do lewej i wywołana funkcja wyróżnia te argumenty ze stosu, zanim zostaną zwrócone.
Dla języka C konwencja nazewnictwa __stdcall używa nazwy funkcji poprzedzonej znakiem podkreślenia (_), po której następuje znak handlowego „po” (@) oraz rozmiar argumentów funkcji w bajtach.Nie wykonano żadnego procesu tłumaczenia.Kompilator używa tego szablonu do konwencji nazewnictwa:
_functionname@number
Charakterystyka __vectorcall
Argumenty funkcji liczby całkowitej __vectorcall są przekazywane przez wartość przy użyciu maksymalnie dwóch (na x86) lub czterech (na x64) rejestrów całkowitoliczbowych i maksymalnie sześciu rejestrów XMM dla liczb zmiennoprzecinkowych i wartości wektorowych, a pozostałe są przekazywane na stosie od prawej do lewej.Wywołana funkcja czyści stos, przed jego zwracaniem.Wartości zwracane wektor i zmiennoprzecinkowej są zwracane w XMM0.
Dla języka C konwencja nazewnictwa __vectorcall używa nazwy funkcji, po której następują dwa znaki handlowego „po” (@@) rozmiar argumentów funkcji w bajtach.Nie wykonano żadnego procesu tłumaczenia.Kompilator używa tego szablonu do konwencji nazewnictwa:
functionname@@number