/Zc:nrvo
(Volitelný ovládací prvek NRVO)
Možnost kompilátoru /Zc:nrvo
řídí volitelnou optimalizaci návratové hodnoty standardu C++ (NRVO) kopírování nebo přesouvání elision chování.
Syntaxe
/Zc:nrvo
[-
]
Poznámky
V sadě Visual Studio 2022 verze 17.4 a novější můžete explicitně povolit volitelné chování kopírování nebo přesunu elision pomocí možnosti kompilátoru /Zc:nrvo
. Tato možnost je ve výchozím nastavení vypnutá, ale je nastavena automaticky při kompilaci pomocí /O2
možnosti, /permissive-
možnosti nebo /std:c++20
novější. V části /Zc:nrvo
, kopírování a přesunutí elize se provádí všude, kde je to možné. Volitelná kopie nebo přesun elize je také možné explicitně zakázat pomocí této /Zc:nrvo-
možnosti. Tyto možnosti kompilátoru řídí jenom volitelnou kopii nebo elizi přesunutí. Povinné kopírování nebo přesouvání elizí (určené standardem C++) nelze zakázat.
Povinná kopie a přesun elision
Standard jazyka C++ vyžaduje, aby se při inicializaci vrácené hodnoty v rámci návratového příkazu inicializovala elision kopírování nebo přesunutí. Například je vyžadována, když funkce vrátí vrácenou ExampleType
funkci pomocí .return ExampleType();
Kompilátor MSVC vždy provádí kopírování a přesouvání elision pro return
příkazy, pokud je to nutné, i v rámci /Zc:nrvo-
.
Volitelná kopie a přesun elision
return
Pokud příkaz obsahuje výraz ne primitivního typu, jeho spuštění zkopíruje výsledek výrazu do návratového slotu volající funkce. Kompilátor vyvolá konstruktor kopírování nebo přesunutí vráceného typu. Když je funkce ukončena, volají se destruktory místních proměnných funkce, které zahrnují všechny proměnné pojmenované ve výrazu.
Standard C++ umožňuje kompilátoru (ale nevyžaduje) volitelně sestavit vrácený objekt přímo v návratovém slotu volající funkce. Tato konstrukce přeskočí (nebo eliduje) konstruktor kopírování nebo přesunutí spuštěný jako součást return
příkazu. Na rozdíl od většiny ostatních optimalizací může mít tato transformace pozorovatelný vliv na výstup programu. Konkrétně se konstruktor kopírování nebo přesunutí a přidružený destruktor nazývají o jednu kratší dobu. Standard stále vyžaduje, aby pojmenovaná vrácená proměnná má definovaný konstruktor kopírování nebo přesunutí, a to i v případě, že kompilátor eleiduje konstruktor ve všech případech.
Ve verzích před sadou Visual Studio 2022 verze 17.4 platí, že pokud jsou optimalizace zakázané (například pod /Od
nebo ve funkcích označených #pragma optimize("", off)
), kompilátor provádí pouze povinné kopírování a přesouvání elis. V části /O2
Starší kompilátory provádějí volitelnou kopii nebo přesunují elizi při vrácení pojmenované proměnné v optimalizované funkci, pokud jsou splněny všechny tyto podmínky: neobsahuje smyčky ani zpracování výjimek, nevrací více symbolů s překrývajícími se životnostmi, kopie nebo konstruktor přesunutí typu neobsahuje výchozí argumenty.
Visual Studio 2022 verze 17.4 zvyšuje počet míst, kde kompilátor provádí volitelnou kopii nebo přesune elision v /Zc:nrvo
části , ať už je povoleno explicitně nebo automaticky pomocí /O2
/permissive-
, nebo /std:c++20
novějších možností. V části /Zc:nrvo
kompilátor provádí volitelnou kopii nebo přesune elizi při vrácení pojmenované proměnné pro libovolnou funkci, pokud nemá žádné smyčky nebo zpracování výjimek (jako předtím), vrátí proměnnou ze smyčky; má zpracování výjimek; kopie vráceného typu nebo konstruktor přesunutí má výchozí argumenty. Volitelné elize kopírování nebo přesunutí se při použití nikdy neprodělají /Zc:nrvo-
nebo když funkce vrátí více symbolů s překrývajícími se životnostmi nebo pro vyvolání pojmenované proměnné.
Další informace a příklady povinných a nepovinných elizí kopírování v části /Zc:nrvo
Vylepšení kopírování a přesunu Elision v blogu týmu C++.
Nastavení této možnosti kompilátoru v sadě Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.
V dalších možnostech přidejte
/Zc:nrvo
nebo/Zc:nrvo-
. Změny uložíte kliknutím na OK nebo Použít .
Viz také
/Zc
(Shoda)
/O2
/permissive-
/std
(Určení standardní verze jazyka)