/Zc:throwingNew (předpoklad, že operátor new vyvolá výjimku)
Pokud je zadána možnost /Zc:throwingNew , kompilátor optimalizuje volání tak, aby operator new
přeskočí kontroly vrácení ukazatele null. Tato možnost kompilátoru říká, aby předpokládal, že všechny propojené implementace operator new
a vlastní alokátory odpovídají standardu C++ a vyvolává selhání přidělení. Kompilátor ve výchozím nastavení v sadě Visual Studio pesimisticky generuje kontroly null (/Zc:throwingNew-), protože uživatelé mohou propojit s nehodící implementací operator new
nebo zápisem vlastních alokátorových rutin, které vracejí ukazatele null.
Syntaxe
/Zc:throwingNew[-]
Poznámky
Vzhledem k tomu, ISO C++98, standard určil, že výchozí operátor nový vyvolá, std::bad_alloc
když přidělení paměti selže. Verze Visual C++ až do sady Visual Studio 6.0 vrátily ukazatel null při selhání přidělení. Počínaje sadou Visual Studio 2002 operator new
odpovídá standardu a vyvolá chybu. Pro podporu kódu, který používá starší styl přidělování, Visual Studio poskytuje propojitelnou implementaci operator new
v nothrownew.obj, která vrací ukazatel null na selhání. Kompilátor ve výchozím nastavení také generuje obranné kontroly null, aby zabránil těmto starším alokátorům v tom, aby způsobil okamžité chybové ukončení při selhání. Parametr /Zc:throwingNew kompilátoru říká, aby tyto kontroly null vynechal, za předpokladu, že všechny propojené alokátory paměti odpovídají standardu. To se nevztahuje na explicitní nevyvolání operator new
přetížení, které jsou deklarovány pomocí dalšího parametru typu std::nothrow_t
a mají explicitní noexcept
specifikaci.
Koncepčně, vytvořit objekt v bezplatném úložišti, kompilátor vygeneruje kód pro přidělení své paměti a potom vyvolá jeho konstruktor pro inicializaci paměti. Vzhledem k tomu, že kompilátor MSVC obvykle nemůže zjistit, zda tento kód bude propojen s nevyhovujícím, alokátorem, ve výchozím nastavení také vygeneruje kontrolu null před voláním konstruktoru. Zabrání se tak dereference ukazatele null ve volání konstruktoru, pokud se nezdaří vyvolání přidělení. Ve většině případů jsou tyto kontroly zbytečné, protože výchozí operator new
alokátory vyvolá místo vrácení ukazatelů null. Kontroly mají také nešťastné vedlejší účinky. Nafoukne velikost kódu, zatopí prediktor větve a inhibují další užitečné optimalizace kompilátoru, jako je devirtualizace nebo šíření const mimo inicializovaný objekt. Kontroly existují pouze pro podporu kódu, který odkazuje na nothrownew.obj nebo má vlastní nekomformní operator new
implementace. Pokud nepoužíváte nevyhovující operator new
kód, doporučujeme k optimalizaci kódu použít /Zc:throwingNew .
Možnost /Zc:throwingNew je ve výchozím nastavení vypnutá a parametr /permissive-.
Pokud kompilujete pomocí generování kódu v čase propojení (LTCG), nemusíte zadávat /Zc:throwingNew. Pokud je váš kód zkompilován pomocí LTCG, kompilátor může zjistit, jestli se používá výchozí implementace odpovídající.operator new
Pokud ano, kompilátor automaticky vynechá kontroly null. Linker vyhledá příznak /ThrowingNew , který zjistí, jestli implementace operator new
vyhovuje. Tento příznak můžete pro linker zadat zahrnutím této direktivy do zdroje pro novou implementaci vlastního operátoru:
#pragma comment(linker, "/ThrowingNew")
Další informace o problémech s shodami v jazyce Visual C++ naleznete v tématu Nestandardní chování.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí 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.
V rozevírací nabídce Konfigurace zvolte Všechny konfigurace.
Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.
Upravte vlastnost Další možnosti tak, aby zahrnovala /Zc:throwingNew nebo /Zc:throwingNew- a pak zvolte OK.
Viz také
Parametry kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC
/Zc (shoda)
noexcept (C++)
Specifikace výjimek (throw) (C++)
terminate (exception)