/Gd, /Gr, /Gv, /Gz (Konvence volání)
Tyto možnosti určují pořadí, ve kterém jsou argumenty funkce vloženy do zásobníku, zda funkce volajícího nebo volaná funkce odstraní argumenty ze zásobníku volání na konci volání a konvence dekorování pojmenování, kterou kompilátor používá k identifikaci jednotlivých funkcí.
/Gd
/Gr
/Gv
/Gz
Poznámky
Výchozí nastavení /Gd určuje __cdecl konvence volání pro všechny funkce s výjimkou členských funkcí jazyka C++ a funkce označené __stdcall, __fastcall nebo __vectorcall.
/Gr určuje __fastcall konvence volání pro všechny funkce s výjimkou členských funkcí jazyka C++, funkce s názvem main a funkce, které jsou označeny __cdecl, __stdcall nebo __vectorcall.Všechny funkce __fastcall musí mít prototypy.Tato konvence volání je k dispozici pouze v kompilátorech, které se zaměřují na x86 a je ignorováno kompilátory, které se zaměřují na jiné architektury.
/Gz určuje __stdcall konvence volání pro všechny funkce s výjimkou členských funkcí jazyka C++, funkce s názvem main a funkce, které jsou označeny __cdecl, __fastcall nebo __vectorcall.Všechny funkce __stdcall musí mít prototypy.Tato konvence volání je k dispozici pouze v kompilátorech, které se zaměřují na x86 a je ignorováno kompilátory, které se zaměřují na jiné architektury.
/Gv určuje __vectorcall konvence volání pro všechny funkce s výjimkou členských funkcí jazyka C++, funkcí pojmenovaných jako hlavní, funkcí s proměnným seznamem argumentů vararg nebo funkce, které jsou označeny konfliktním atributem __cdecl, __stdcall nebo __fastcall.Tato konvence volání je k dispozici pouze na architekturách x86 a x64, které podporují /arch:SSE2 a vyšší a je ignorován kompilátory, které se zaměřují na architekturu ARM.
Funkce, které přijímají počet argumentů proměnné musí být označeny __cdecl.
/Gd, /Gr, /Gv a /Gz nejsou kompatibilní s /clr:safe nebo /clr:pure.
[!POZNÁMKA]
Ve výchozím nastavení pro procesory x86 členské funkce C++ použijí __thiscall.
Pro všechny procesory, členská funkce, která je explicitně označena jako __cdecl, __fastcall, __vectorcall nebo __stdcall používá zadané konvence volání, pokud není ignorována u této architektury.Členská funkce, která přijímá proměnný počet argumentů, vždy používá konvenci volání __cdecl.
Tyto možnosti kompilátoru nemají žádný vliv na názvovou dekoraci metod a funkcí jazyka C++.Pokud nejsou deklarovány jako extern "C", používají metody a funkce jazyka C++ jiné schéma dekorování názvů.Další informace naleznete v tématu Dekorované názvy.
Další informace o konvencích volání viz Konvence volání.
Specifikace __cdecl
U procesorů x86 jsou všechny argumenty funkce předány v zásobníku zprava doleva.V architektuře ARM a x64 některé argumenty jsou předány registrem a ostatní jsou předány v zásobníku zprava doleva.Rutina volání vezme argumenty ze zásobníku (POP).
Pro jazyk C používá konvence pojmenování __cdecl název funkce začínající podtržítkem ( _ ); neprobíhá překlad velikosti písmen.Pokud nejsou deklarovány jako extern "C", používají funkce jazyka C++ jiné schéma dekorování názvů.Další informace naleznete v tématu Dekorované názvy.
Specifikace __fastcall
Část argumentu funkce __fastcall se předává v registrech (pro x86 procesory, ECX a EDX), a zbývající je vložena do zásobníku, zprava doleva.Volaná rutina vyjme tyto argumenty ze zásobníku ještě před jeho vrácením.Obvykle /Gr snižuje dobu provádění.
[!POZNÁMKA]
Buďte opatrní při použití konvence volání __fastcall pro všechny funkce, které jsou napsán ve vloženém jazyce sestavení.Využití registrů by mohlo být v konfliktu s použitím kompilátoru.
Pro jazyk C konvence pojmenování __fastcall používá název funkce začínající zavináčem (@) následovaný velikostí argumentů v bajtech.Neprovádí se žádný překlad případu.Kompilátor používá tuto šablonu pro vytváření názvů:
@function_name@number
Při použití konvence pojmenování __fastcall použijte standardní soubory zahrnutí.V opačném případě získáte nevyřešené externí odkazy.
Specifikace __stdcall
Argumenty funkce __stdcall jsou vloženy do zásobníku zprava doleva a volaná funkce tyto argumenty zobrazí ze zásobníku, dříve, než se vrátí.
Pro jazyk C konvence pojmenování __stdcall používá název funkce začínající podtržítkem ( _ ) následovaným zavináčem (@) a velikostí argumentů v bajtech.Neprovádí se žádný překlad případu.Kompilátor používá tuto šablonu pro vytváření názvů:
_functionname@number
Specifikace __vectorcall
Celočíselné argumenty funkce __vectorcall jsou předány hodnotou, přičemž využívají až dva (na platformě x86) nebo čtyři (na platformě x64) celočíselné registry a až šest registrů XMM pro hodnoty s plovoucí desetinnou čárkou a hodnoty vektoru a ostatní jsou předány do zásobníku zprava doleva.Volaná funkce vyčistí zásobník před jeho vrácením.Vektorové a vrácené hodnoty s plovoucí desetinnou čárkou jsou vráceny do XMM0.
Pro jazyk C konvence pojmenování __vectorcall používá název funkce následovaný dvěma zavináči (@@) a velikostí argumentů funkce v bajtech.Neprovádí se žádný překlad případu.Kompilátor používá tuto šablonu pro vytváření názvů:
functionname@@number