Novinky v jazyce C++ v sadě Visual Studio 2017
Visual Studio 2017 přináší mnoho aktualizací a oprav prostředí C++. Opravili jsme více než 250 chyb a nahlášených problémů v kompilátoru a nástrojích. Mnoho zákazníků odeslalo prostřednictvím možnosti Nahlásit problém a poskytnout možnosti návrhu v části Odeslat zpětnou vazbu. Děkujeme vám, že hlásíte chyby!
Další informace o novinkách ve všech sadě Visual Studio najdete v tématu Co je nového v sadě Visual Studio 2017. Informace o novinkách jazyka C++ v sadě Visual Studio 2019 najdete v tématu Co je nového pro C++ v sadě Visual Studio 2019. Informace o novinkách jazyka C++ v sadě Visual Studio 2015 a starších verzích najdete v tématu Visual C++ What's New 2003 až 2015. Informace o novinkách v dokumentaci jazyka C++ najdete v dokumentaci Microsoft C++: Co je nového.
Kompilátor jazyka C++ sady Visual Studio 2017
Vylepšení shody jazyka C++
V této verzi jsme aktualizovali kompilátor C++ a standardní knihovnu s vylepšenou podporou funkcí C++11 a C++14. Zahrnuje také předběžnou podporu některých funkcí, které by měly být ve standardu C++17. Podrobné informace najdete v tématu Vylepšení shody jazyka C++ v sadě Visual Studio 2017.
Visual Studio 2017 verze 15.5
Kompilátor podporuje přibližně 75 % funkcí, které jsou v jazyce C++17 nové, včetně strukturovaných vazeb, constexpr
lambda, if constexpr
vložených proměnných, výrazů skládání a přidávání noexcept
do systému typů. Tyto funkce jsou dostupné v rámci /std:c++17
této možnosti. Další informace naleznete v tématu Vylepšení shody jazyka C++ v sadě Visual Studio 2017
Visual Studio 2017 verze 15.7
Sada nástrojů kompilátoru MSVC v sadě Visual Studio verze 15.7 teď odpovídá standardu C++. Další informace naleznete v tématu Oznámení: MSVC odpovídá souladu se standardem C++ a jazykem Microsoft C/C++.
Visual Studio 2017 verze 15.8
Přepínač /experimental:preprocessor
kompilátoru umožňuje nový experimentální preprocesor MSVC, který nakonec bude vyhovovat všem platným standardům jazyka C a C++. Další informace najdete v tématu MSVC – přehled nového preprocesoru.
Nové možnosti kompilátoru
/permissive-
: Povolte všechny možnosti kompilátoru dodržování striktních standardů a zakažte většinu rozšíření kompilátoru specifického pro Microsoft (ale ne__declspec(dllimport)
). Tato možnost je ve výchozím nastavení zapnutá v sadě Visual Studio 2017 verze 15.5. Režim/permissive-
shody zahrnuje podporu dvoufázového vyhledávání názvů. Další informace naleznete v tématu Vylepšení shody jazyka C++ v sadě Visual Studio./diagnostics
: Umožňuje zobrazit diagnostickou chybu nebo umístění upozornění třemi různými způsoby: jenom číslo řádku, číslo řádku a sloupec nebo číslo řádku a sloupec s stříškou pod řádkem kódu./debug:fastlink
: Povolte až 30 % rychlejší přírůstkové propojení (vs. Visual Studio 2015), protože nekopírujte všechny ladicí informace do souboru PDB. Soubor PDB místo toho odkazuje na ladicí informace pro objekt a soubory knihovny použité k vytvoření spustitelného souboru. Podívejte se na rychlejší cyklus sestavení C++ ve VS "15" a/Debug:fastlink
doporučení pro urychlení sestavení C++ v sadě Visual Studio.Visual Studio 2017 umožňuje používat s
/sdl
/await
. Omezení jsme/RTC
odebrali u korutin.
Visual Studio 2017 verze 15.3
/std:c++14
a/std:c++latest
: Tyto možnosti kompilátoru umožňují vyjádřit výslovný souhlas s konkrétními verzemi programovacího jazyka ISO C++ v projektu. Většina nových standardních funkcí konceptu je chráněna/std:c++latest
možností./std:c++17
povolí sadu funkcí C++17 implementovaných kompilátorem. Tato možnost zakáže podporu kompilátoru a standardní knihovny pro funkce po C++17: ty, které jsou změněny nebo nové v novějších verzích funkčního konceptu a aktualizace vad standardu C++. Pokud chcete tyto funkce povolit, použijte/std:c++latest
.
Codegen, zabezpečení, diagnostika a správa verzí
Tato verze přináší několik vylepšení optimalizace, generování kódu, správy verzí sady nástrojů a diagnostiky. Mezi důležitá vylepšení patří:
- Vylepšené generování kódu smyček: Podpora automatické vektorizace dělení konstantních celých čísel, lepší identifikace vzorů memset
- Vylepšené zabezpečení kódu: Vylepšená emise diagnostiky kompilátoru přetečení vyrovnávací paměti a
/guard:cf
nyní chrání příkazy switch, které generují jump tabulky. - Správa verzí: Hodnota předdefinovaných maker preprocesoru, _MSC_VER je nyní monotonicky aktualizována při každé aktualizaci sady nástrojů Visual C++. Další informace naleznete v tématu Visual C++ Compiler Version.
- Nové rozložení sady nástrojů: Kompilátor a související nástroje sestavení mají na vývojovém počítači novou strukturu umístění a adresáře. Nové rozložení umožňuje souběžné instalace více verzí kompilátoru. Další informace naleznete v tématu Nástroje kompilátoru Rozložení v sadě Visual Studio 2017.
- Vylepšená diagnostika: Ve výstupním okně se teď zobrazuje sloupec, ve kterém došlo k chybě. Další informace najdete v tématu Vylepšení diagnostiky kompilátoru C++ ve VS 15 Preview 5.
- Při použití korutin se odebralo experimentální výnos klíčového slova (k dispozici pod
/await
možností). Váš kód by se měl aktualizovat tak, aby místo toho používalco_yield
. Další informace najdete v tématuyield
Klíčové slovo, které se má státco_yield
ve VS 2017.
Visual Studio 2017 verze 15.3
Vylepšení diagnostiky v kompilátoru Další informace najdete v tématu Vylepšení diagnostiky v sadě Visual Studio 2017 15.3.0.
Visual Studio 2017 verze 15.5
Výkon modulu runtime Visual C++ se i nadále vylepšuje prostřednictvím lepší vygenerované kvality kódu. Teď stačí znovu zkompilovat kód a vaše aplikace bude běžet rychleji. Některé optimalizace kompilátoru jsou zcela nové, například vektorizace podmíněných skalárních úložišť, kombinování volání sin(x)
a cos(x)
do nového sincos(x)
a odstranění redundantních instrukcí z optimalizátoru SSA. Další optimalizace kompilátoru jsou vylepšení stávajících funkcí, jako jsou například heuristika vektorizátoru pro podmíněné výrazy, lepší optimalizace smyček a float min/max codegen. Linker má novou a rychlejší /OPT:ICF
implementaci, což může vést až k 9% zrychlení doby propojení a další opravy výkonu v přírůstkovém propojení. Další informace naleznete v tématu /OPT (optimalizace) a /INCREMENTAL (přírůstkové propojení).
Kompilátor Microsoft C++ podporuje AVX-512 společnosti Intel. Obsahuje instrukce Vector Length, které přinášejí nové funkce v AVX-512 na 128bitové a 256bitové široké registry.
Možnost /Zc:noexceptTypes-
se dá použít k návratu k verzi noexcept
C++14 při obecném použití režimu C++17. Tato možnost umožňuje aktualizovat zdrojový kód tak, aby odpovídal C++17, aniž byste museli přepisovat veškerý throw()
kód najednou. Další informace naleznete v tématu Dynamické odebrání specifikace výjimky a noexcept.
Visual Studio 2017 verze 15.7
- Nový přepínač kompilátoru /Qspectre , který pomáhá zmírnit útoky na spekulativní spuštění na straně kanálu. Další informace naleznete v tématu Zmírnění rizik spectre v MSVC.
- Nové diagnostické upozornění pro zmírnění rizik spectre Další informace najdete v tématu Diagnostika Spectre v sadě Visual Studio 2017 verze 15.7 Preview 4.
- Nová hodnota pro /Zc,
/Zc:__cplusplus
umožňuje správné generování sestav standardní podpory jazyka C++. Například když je přepínač nastaven a kompilátor je v/std:c++17
režimu, hodnota se rozbalí na201703L
. Další informace naleznete v tématu MSVC nyní správně hlásí __cplusplus.
Standardní knihovna C++
Vylepšení správnosti
Visual Studio 2017 RTM (verze 15.0)
- Menší
basic_string
_ITERATOR_DEBUG_LEVEL != 0
vylepšení diagnostiky. Když se kontrola IDL spustí v řetězcových strojích, teď hlásí konkrétní chování, které způsobilo cestu. Například místo "iterátoru řetězce není možné odvodit" získáte "iterátor řetězce nemůže dereference, protože je mimo rozsah (např. koncový iterátor)". std::promise
Opravili jsme operátor přiřazení přesunutí, který dříve mohl způsobit zablokování kódu navždy.- Oprava chyb kompilátoru s implicitní převod na
atomic<T*>
T*
. pointer_traits<Ptr>
nyní správně rozpoznáPtr::rebind<U>
.- Opravili jsme chybějící
const
kvalifikátor v operátorumove_iterator
odčítání. - Byl opraven tichý chybný codegen pro stavově definované alokátory definované uživatelem
propagate_on_container_copy_assignment
apropagate_on_container_move_assignment
. atomic<T>
nyní toleruje přetíženéoperator&()
.- Mírně vylepšená diagnostika kompilátoru pro nesprávná
bind()
volání.
Visual Studio 2017 RTM vylepšuje více standardních knihoven. Úplný seznam najdete v tématu Opravy standardní knihovny týmového blogu C++ ve VS 2017 RTM.
Visual Studio 2017 verze 15.3
- Standardní kontejnery knihoven nyní uchytají místo
max_size()
max()
numeric_limits<difference_type>::max()
size_type
. Tato změna zajišťuje, že výsledekdistance()
iterátorů z tohoto kontejneru je reprezentovatelný ve návratovémdistance()
typu . - Oprava chybějící specializace
auto_ptr<void>
. - Algoritmy
for_each_n()
a algoritmygenerate_n()
search_n()
se dříve nepodařilo zkompilovat, pokud argument délky nebyl celočíselným typem. Nyní se snaží převést neintegrovat délky na iterátory 'difference_type
. normal_distribution<float>
už negeneruje upozornění v rámci standardní knihovny o zužování z dvojité na plovoucí.- Opravili jsme některé
basic_string
operace, které se používalynpos
místomax_size()
při kontrole maximálního přetečení velikosti. condition_variable::wait_for(lock, relative_time, predicate)
čekala by na celou relativní dobu, pokud by došlo k nechtěné buzení. Teď čeká pouze na jeden interval relativního času.future::get()
nyní zneplatnífuture
hodnotu , protože standard vyžaduje.iterator_traits<void *>
bývala tvrdá chyba, protože se pokusila vytvořitvoid&
. Nyní se čistě stává prázdnou strukturou, která umožňuje použitíiterator_traits
podmínek SFINAE v "is iterator".- Opravili jsme některá upozornění hlášená jazykem Clang
-Wsystem-headers
. - Opravili jsme také "specifikaci výjimky v deklaraci neodpovídá předchozí deklaraci" hlášená jazykem Clang
-Wmicrosoft-exception-spec
. - Opravili jsme také upozornění řazení seznamu mem-initializer-list hlášená Clangem a C1XX.
- Neuspořádané kontejnery neprohodily jejich funkce hash ani predikáty, když byly prohozeny samotné kontejnery. Teď to dělají.
- Mnoho operací prohození kontejnerů je nyní označeno
noexcept
(protože naše standardní knihovna nikdy nechybuje výjimku při zjišťovánípropagate_on_container_swap
nedefinované podmínky nedefinovaného alokátoru bez rovná se). - Mnoho
vector<bool>
operací je nyní označenonoexcept
. - Standardní knihovna teď vynucuje odpovídající alokátor
value_type
(v režimu C++17) s řídicím šrafou opt-out. - Opravili jsme některé podmínky, kdy se do obsahu řetězců zakódovaly vlastní vložení
basic_string
rozsahu. (Poznámka: Standard stále zakazuje vložení do vektorů samosou rozsahu.) basic_string::shrink_to_fit()
již není ovlivněn alokátorempropagate_on_container_swap
.std::decay
nyní zpracovává abominovatelné typy funkcí, to znamená typy funkcí, které jsou cv-qualified, ref-qualified, nebo obojí.- Změněné direktivy include pro použití správné citlivosti velkých a malých písmen a lomítek, což zlepšuje přenositelnost.
- Oprava upozornění C4061 "enumerator 'enumerator' in switch of enum 'enumeration' is not explicit handled by a case label." Toto upozornění je ve výchozím nastavení vypnuté a bylo opraveno jako výjimka obecných zásad standardní knihovny pro upozornění. (Standardní knihovna je
/W4
čistá, ale nepokouší se o/Wall
vyčištění. Mnoho upozornění mimo výchozí nastavení jsou neobvykle hlučná a nejsou určená k pravidelnému použití.) - Vylepšené
std::list
kontroly ladění Vypsat iterátory teď zaškrtněteoperator->()
alist::unique()
teď označí iterátory jako neplatné. - Oprava metaprogramování alokátoru použití v objektu
tuple
.
Visual Studio 2017 verze 15.5
std::partition
nyní místo času volá predikátN
časyN + 1
, protože standard vyžaduje.- Pokusy o zabránění magic statics ve verzi 15.3 jsou opraveny ve verzi 15.5.
std::atomic<T>
už není nutnéT
, aby byl výchozí konstruktovatelný.- Algoritmy haldy, které berou logaritmický čas, se při povoleném ladění iterátoru chovají odlišně. Už nedělají lineární časové tvrzení, že vstup je ve skutečnosti haldou.
__declspec(allocator)
je nyní strážený pouze pro C1XX, aby se zabránilo upozorněním z jazyka Clang, který nerozumí tomuto declspec.basic_string::npos
je nyní k dispozici jako konstanta času kompilace.std::allocator
V režimu C++17 nyní správně zpracovává přidělování přerovnaných typů, to znamená typy, jejichž zarovnání je větší nežmax_align_t
, pokud není zakázáno/Zc:alignedNew-
. Například vektory objektů s zarovnáním 16 bajtů nebo 32 bajtů jsou teď správně zarovnané pro instrukce SSE a AVX.
Vylepšení shody
- Přidali <jsme všechny>, <string_view>,
apply()
,make_from_tuple()
. - Přidání <volitelného>, <variantního>
shared_ptr::weak_type
a <cstdalignu> - Povoleno C++14
constexpr
vmin(initializer_list)
,max(initializer_list)
aminmax(initializer_list)
, amin_element()
,max_element()
a .minmax_element()
Další informace naleznete v tématu Shoda jazyka Microsoft C/C++.
Visual Studio 2017 verze 15.3
- Implementovalo se několik dalších funkcí C++17. Další informace naleznete v tabulce shody jazyka Microsoft C++.
- Implementovali jsme P0602R0 "varianta a volitelné by měly šířit trivialitu kopírování a přesouvání".
- Standardní knihovna teď oficiálně toleruje zakázání dynamického RTTI prostřednictvím možnosti /GR- . Obě
dynamic_pointer_cast()
irethrow_if_nested()
ze své podstaty vyžadujídynamic_cast
, takže standardní knihovna je nyní označí jako=delete
v části/GR-
. - I když je dynamické RTTI zakázané prostřednictvím
/GR-
, "static RTTI" ve formětypeid(SomeType)
je stále k dispozici a pohání několik standardních komponent knihovny. Standardní knihovna nyní podporuje také zakázání této funkce prostřednictvím/D_HAS_STATIC_RTTI=0
. Tento příznak také zakážestd::any
, atarget_type()
target()
členské funkcestd::function
, aget_deleter()
přítel členské funkcestd::shared_ptr
astd::weak_ptr
. - Standardní knihovna teď místo podmíněně definovaných maker používá C++14
constexpr
bezpodmínečně. - Standardní knihovna teď interně používá šablony aliasů.
- Standardní knihovna nyní používá
nullptr
interně místonullptr_t{}
. (Interní použití hodnoty NULL je vymýcené. Interní použití hodnoty 0 as-null se postupně vyčistí.) - Standardní knihovna nyní používá
std::move()
interně místo stylisticky chybného použitístd::forward()
. - Změněno
static_assert(false, "message")
na#error message
. Tato změna zlepšuje diagnostiku kompilátoru, protože#error
okamžitě zastaví kompilaci. - Standardní knihovna již nebude oznamovat funkce jako
__declspec(dllimport)
. Moderní linkerová technologie ji už nevyžaduje. - Extrahované funkce SFINAE do výchozích argumentů šablony, které snížily nepotřebné hodnoty ve srovnání s návratovými typy a typy argumentů funkce.
- Kontroly ladění náhodně <nyní používají obvyklé stroje standardní knihovny místo vnitřní funkce
_Rng_abort()
, která volalafputs()
stderr
.> Implementace této funkce se uchovává kvůli binární kompatibilitě. Odebereme ji v další binární nekompatibilní verzi standardní knihovny.
Visual Studio 2017 verze 15.5
- Bylo přidáno, vyřazeno nebo odebráno několik standardních funkcí knihovny podle standardu C++17. Další informace naleznete v tématu Vylepšení shody jazyka C++ v sadě Visual Studio.
- Experimentální podpora následujících paralelních algoritmů:
all_of
any_of
for_each
for_each_n
none_of
reduce
replace
replace_if
sort
- Podpisy pro následující paralelní algoritmy jsou přidány, ale v tuto chvíli nejsou paralelizovány. Profilace neukazovala žádnou výhodu při paralelizaci algoritmů, které přesunují nebo permutují pouze prvky:
copy
copy_n
fill
fill_n
move
reverse
reverse_copy
rotate
rotate_copy
swap_ranges
Visual Studio 2017 verze 15.6
<memory_resource>
- Základy knihoven V1
- Odstranění
polymorphic_allocator
přiřazení - Vylepšení odpočtu argumentů šablony třídy
Visual Studio 2017 verze 15.7
- Podpora paralelních algoritmů už není experimentální
- Nová implementace
<filesystem>
- Převody základních řetězců (částečné)
std::launder()
std::byte
hypot(x,y,z)
- Vyhněte se zbytečnému rozpadu
- Matematické speciální funkce
constexpr char_traits
- Odpočtové příručky pro standardní knihovnu
Další informace naleznete v tématu Shoda jazyka Microsoft C/C++.
Opravy výkonu a propustnosti
- Přetížení
basic_string::find(char)
byla volánytraits::find
pouze jednou. Dříve byla implementována jako obecné hledání řetězce s délkou 1. basic_string::operator==
Teď zkontroluje velikost řetězce před porovnáním obsahu řetězců.- Odebrané kontrolní spojky v
basic_string
, což bylo obtížné pro optimalizátor kompilátoru analyzovat. U všech krátkých řetězců má voláníreserve
stále nenulové náklady na nic. std::vector
byl přepracován pro správnost a výkon: aliasing během operací vložení a emplace je nyní správně zpracován podle požadavků standardu, silná záruka výjimky je nyní poskytována v případě, že standard vyžaduje prostřednictvímmove_if_noexcept()
a další logiky, a vkládání a vkládání provádí méně operací prvků.- Standardní knihovna jazyka C++ se teď vyhne dereferencování prázdných ukazatelů.
- Lepší
weak_ptr::lock()
výkon. - Pokud chcete zvýšit propustnost kompilátoru, hlavičky standardní knihovny jazyka C++ se teď vyhýbají zahrnutí deklarací nepotřebných vnitřních objektů kompilátoru.
- Vylepšili jsme výkon konstruktorů
std::string
astd::wstring
konstruktorů přesunutí o více než třikrát.
Visual Studio 2017 verze 15.3
- Pracovali jsme s interakcemi
noexcept
, které zabránily vloženístd::atomic
implementace do funkcí, které používají strukturované zpracování výjimek (SEH). - Změnili jsme interní
_Deallocate()
funkci standardní knihovny tak, aby se optimalizovala na menší kód, což umožňuje vložit do více míst. - Změna
std::try_lock()
tak, aby místo rekurze používala rozšíření balíčku. - Vylepšili jsme
std::lock()
algoritmus zabránění vzájemnému zablokování, aby místo otáčenítry_lock()
na všech zámcích používallock()
operace. - Povolili jsme optimalizaci pojmenované návratové hodnoty v
system_category::message()
souboru . conjunction
adisjunction
teď místo typů vytvořte instanciN + 1
2N + 2
typů.std::function
již nedochází k vytvoření instance alokátoru podpory pro každý typ vymazatelný volatelný, zlepšení propustnosti a snížení .obj velikosti v programech, které předávají mnoho různých lambdastd::function
.allocator_traits<std::allocator>
obsahuje ručně vloženéstd::allocator
operace, což snižuje velikost kódu v kódu, který komunikujestd::allocator
pouze prostřednictvímallocator_traits
(to znamená ve většině kódu).- Minimální rozhraní alokátoru C++11 je nyní zpracováno standardní knihovnou volání
allocator_traits
přímo, místo zabalení alokátoru do interní třídy_Wrap_alloc
. Tato změna snižuje velikost kódu vygenerovanou pro podporu alokátoru, v některých případech zlepšuje schopnost optimalizátoru zdůvodnit standardní kontejnery knihoven a poskytuje lepší prostředí ladění (jak teď vidíte typ alokátoru místo_Wrap_alloc<your_allocator_type>
v ladicím programu). - Odebrané metaprogramování pro přizpůsobené
allocator::reference
, které alokátory nemohou přizpůsobit. (Alokátory můžou kontejnery používat fancy ukazatele, ale ne fancy odkazy.) - Front-end kompilátoru se naučil rozbalit ladicí iterátory ve smyčce založených na rozsahu a zlepšit výkon sestavení ladění.
- Vnitřní
basic_string
cesta zmenšení proshrink_to_fit()
areserve()
již není v cestě k operacím relokace, čímž se zmenšuje velikost kódu pro všechny ztlumené členy. - Vnitřní
basic_string
růstová cesta již není v cestěshrink_to_fit()
. - Mutační
basic_string
operace jsou nyní faktorovány do nepřiřazování rychlých cest a přidělování funkcí pomalé cesty, což pravděpodobnějším způsobem, že běžné případy no-reallocate budou vloženy do volajících. - Mutační
basic_string
operace nyní vytváří relokované vyrovnávací paměti v upřednostňovaném stavu místo změny velikosti. Například vložení na začátek řetězce teď přesune obsah po vložení přesně jednou. Přesune se buď dolů, nebo do nově přidělené vyrovnávací paměti. V případě skutečného přidělení se už nepřesune dvakrát, nejprve do nově přidělené vyrovnávací paměti a pak dolů. - Operace, které volají standardní knihovnu jazyka C v <řetězci> , teď ukládají adresu do mezipaměti
errno
, aby se odebrala opakovaná interakce s protokolem TLS. - Zjednodušili jsme implementaci
is_pointer
. - Změna výrazu založeného na funkci SFINAE na
struct
avoid_t
na základě funkce byla dokončena. - Standardní algoritmy knihovny se teď vyhýbají následným zvýšením iterátorů.
- Opravili jsme upozornění na zkrácení při použití 32bitových alokátorů v 64bitových systémech.
std::vector
Přiřazení přesunutí je nyní efektivnější v případě, že není stejný případ alokátoru, a to opětovným použitím vyrovnávací paměti, pokud je to možné.
Visual Studio 2017 verze 15.5
basic_string<char16_t>
nyní se zabývá stejnýmimemcmp
memcpy
a podobnými optimalizacemi, kterébasic_string<wchar_t>
se týkají.- Omezení optimalizátoru, které zabránilo vkládání ukazatelů na funkce, které jsme odhalili v naší práci "vyhnout se kopírování funkcí" v sadě Visual Studio 2015 Update 3, se vyřešilo a obnovilo výkon
lower_bound(iter, iter, function pointer)
. - Režie ladění iterátoru při ověřování objednávek vstupů do
includes
,set_difference
set_symmetric_difference
aset_union
byla snížena zrušením přepsání iterátorů před kontrolou pořadí. std::inplace_merge
nyní přeskočí přes prvky, které jsou již umístěny.std::random_device
Konstrukce již nekonstruuje a pak zničí .std::string
std::equal
astd::partition
měl průchod optimalizace jump-threading, který ukládá porovnání iterátoru.- Když
std::reverse
se předají ukazatele na triviálně kopírovatelnéT
, nyní odesílá do ručně psané vektorizované implementace. std::fill
,std::equal
astd::lexicographical_compare
byli učili, jak odesílat domemset
amemcmp
prostd::byte
agsl::byte
(a další char-like výčty a výčty tříd). Vzhledem k tomu, žestd::copy
se odesílají pomocíis_trivially_copyable
, nepotřebovala žádné změny.- Standardní knihovna již neobsahuje destruktory s prázdnými složenými závorkami, jejichž jediným chováním bylo, aby typy nebyly triviálně destrukovatelné.
Další knihovny
Podpora opensourcové knihovny
Vcpkg je opensourcový nástroj příkazového řádku, který výrazně zjednodušuje proces získávání a sestavování opensourcových statických knihoven C++ a knihoven DLLS v sadě Visual Studio. Další informace najdete v tématu vcpkg.
CPPRest SDK 2.9.0
Visual Studio 2017 verze 15.5
CPPRestSDK, multiplatformní webové rozhraní API pro C++, se aktualizuje na verzi 2.9.0. Další informace najdete v tématu CppRestSDK 2.9.0 je k dispozici na GitHubu.
ATL
Visual Studio 2017 verze 15.5
- Další sada oprav shody s vyhledáváním názvů
- Existující konstruktory přesunutí a operátory přiřazení přesunutí jsou teď správně označené jako nepřerůstající
- Zrušení platného upozornění C4640 o bezpečném inicializaci místních statických dat v atlstr.h
- Inicializace místních statických objektů v bezpečném vlákně byla automaticky vypnuta v sadě nástrojů XP při použití knihovny ATL k sestavení knihovny DLL. Teď to není. Pokud nechcete inicializaci v bezpečném vlákně, můžete do nastavení projektu přidat
/Zc:threadSafeInit-
.
Modul runtime Visual C++
- Nová hlavička "cfguard.h" pro symboly ochrany toku řízení
Visual Studio 2017 C++ IDE
- Výkon při změně konfigurace je teď vyšší u nativních projektů C++ a mnohem vyšší u projektů C++/CLI. Když se konfigurace řešení poprvé aktivuje, je rychlejší a všechny pozdější aktivace této konfigurace řešení jsou téměř okamžité.
Visual Studio 2017 verze 15.3
- Několik průvodců projektu a kódu je přepsaných ve stylu dialogu podpisu.
- Add Class now launch the Add Class wizard přímo. Všechny ostatní položky, které zde byly dříve, jsou nyní k dispozici v části Přidat > novou položku.
- Projekty Win32 jsou nyní v dialogovém okně Nový projekt v kategorii Plocha systému Windows.
- Šablony konzoly systému Windows a desktopové aplikace teď vytvářejí projekty bez zobrazení průvodce. Ve stejné kategorii je nový Průvodce plochou windows, který zobrazuje stejné možnosti jako starý průvodce konzolovou aplikací Win32.
Visual Studio 2017 verze 15.5
Mnohem rychleji běží několik operací C++, které používají modul IntelliSense pro refaktoring a navigaci v kódu. Následující čísla jsou založená na řešení Visual Studio Chromium s 3500 projekty:
Funkce | Zlepšení výkonu |
---|---|
Přejmenovat | 5,3x |
Změnit signaturu | 4,5x |
Najít všechny odkazy | 4,7x |
C++ teď podporuje kombinaci kláves Ctrl+Kliknutí na definici a usnadňuje navigaci myší na definice. Vizualizér struktur z balíčku Productivity Power Tools je nyní ve výchozím nastavení součástí produktu.
IntelliSense
Ve výchozím nastavení je nyní používán nový databázový stroj využívající SQLite. Nový modul zrychluje databázové operace, jako je Přejít k definici a Najít všechny odkazy. Výrazně zlepšuje dobu analýzy počátečního řešení. Nastavení se přesunulo do rozšířeného textového editoru > Možností > nástrojů > C/C++>. (Dříve to bylo pod ... C/C++ > Experimentální.)
Vylepšili jsme výkon Technologie IntelliSense u projektů a souborů, které nepoužívají předkompilované hlavičky – pro hlavičky v aktuálním souboru se vytvoří automatická předkompilovaná hlavička.
Přidali jsme do seznamu chyb filtrování a nápovědu k chybám technologie IntelliSense. Kliknutí na sloupec s chybami teď umožní je filtrovat. Kliknutím na konkrétní chyby nebo stisknutím klávesy F1 se spustí online hledání chybové zprávy.
Přidali jsme možnost filtrovat položky seznamu členů podle typu.
Přidali jsme novou experimentální funkci prediktivní technologie IntelliSense, která poskytuje kontextově pracující filtrování toho, co se zobrazí v seznamu členů. Další informace naleznete v tématu Vylepšení technologie IntelliSense jazyka C++ – Prediktivní intelliSense a filtrování.
Funkce Najít všechny odkazy (Shift+F12) vám teď pomůže snadno se pohybovat i ve složitých základech kódu. Poskytuje pokročilé seskupení, filtrování, řazení, vyhledávání ve výsledcích a obarvení (pro některé jazyky), abyste mohli jasně porozumět vašim odkazům. V jazyce C++ obsahuje nové uživatelské rozhraní informace o tom, jestli čteme nebo zapisujeme do proměnné.
Funkce IntelliSense typu Dot-to-Arrow se přesunula z experimentálního na pokročilé a je teď ve výchozím nastavení povolená. Editor nabízí rozšíření oborů a rozbalení priority přesunuté z experimentálního na pokročilé.
Funkce experimentálního refaktoringu Změnit podpis a extrahovat funkci jsou nyní ve výchozím nastavení k dispozici.
Přidání experimentální funkce Rychlejší načítání projektů pro projekty C++. Při příštím otevření projektu C++ se načte rychleji a čas, po který se načte mnohem rychleji!
Některé z těchto funkcí jsou společné pro jiné jazyky a některé jsou specifické pro jazyk C++. Další informace o těchto nových funkcích najdete v tématu Oznámení sady Visual Studio 15 Preview 5.
Visual Studio 2017 verze 15.7
- Byla přidána podpora pro ClangFormat. Další informace najdete v tématu Podpora ClangFormat v sadě Visual Studio 2017.
Projekty bez MSBuildu s otevřenou složkou
Visual Studio 2017 zavádí funkci Otevřít složku . Umožňuje kódovat, sestavovat a ladit ve složce obsahující zdrojový kód bez nutnosti vytvářet řešení nebo projekty. Teď je jednodušší začít se sadou Visual Studio, i když váš projekt není projekt založený na nástroji MSBuild. Otevřená složka umožňuje přístup k výkonným funkcím pro porozumění kódu, úpravám, sestavování a ladění. Jsou stejné jako visual studio, které už sada Visual Studio poskytuje pro projekty MSBuild. Další informace naleznete v tématu Projekty otevřít složku pro C++.
- Vylepšení prostředí Otevřít složku Prostředí můžete přizpůsobit prostřednictvím těchto .json souborů:
- CppProperties.json použijte k přizpůsobení technologie IntelliSense a prostředí procházení.
- Tasks.json použijte k přizpůsobení kroků sestavení.
- Launch.json použijte k přizpůsobení prostředí ladění.
Visual Studio 2017 verze 15.3
- Vylepšená podpora alternativních kompilátorů a prostředí sestavení, jako je MinGW a Cygwin. Další informace naleznete v tématu Použití MinGW a Cygwin s Visual C++ a Otevřít složku.
- Přidání podpory pro definování globálních a konfiguračních proměnných prostředí v CppProperties.json a CMakeSettings.json Tyto proměnné prostředí je možné využívat pomocí konfigurací ladění definovaných v launch.vs.json a úlohách v tasks.vs.json. Další informace naleznete v tématu Přizpůsobení prostředí pomocí visual C++ a otevřít složku.
- Vylepšená podpora generátoru Ninja CMake, včetně možnosti snadného cílení na 64bitové platformy.
Podpora CMake prostřednictvím Open Folder
Visual Studio 2017 zavádí podporu pro používání projektů CMake bez převodu na soubory projektu MSBuild (.vcxproj). Další informace najdete v tématu Projekty CMake v sadě Visual Studio. Otevírání projektů CMake s otevřenou složkou automaticky konfiguruje prostředí pro úpravy, sestavování a ladění C++.
C++ IntelliSense funguje bez nutnosti vytvořit soubor CppProperties.json v kořenové složce. Přidali jsme nový rozevírací seznam, který uživatelům umožňuje snadno přepínat mezi konfiguracemi poskytovanými CMake a CppProperties.json soubory.
Prostřednictvím souboru CMakeSettings.json, který je umístěný ve stejné složce jako soubor CMakeLists.txt, se podporuje další konfigurace.
Visual Studio 2017 verze 15.3
- Podpora byla přidána pro generátor CMake Ninja.
Visual Studio 2017 verze 15.4
- Přidání podpory pro import existujících mezipamětí CMake
Visual Studio 2017 verze 15.5
- Přidali jsme podporu pro CMake 3.11, analýzu kódu v projektech CMake, zobrazení Targets v Průzkumník řešení, možnosti generování mezipaměti a kompilaci jednoho souboru. Další informace najdete v tématu Podpora CMake v projektech Visual Studio a CMake v sadě Visual Studio.
Vývoj desktopových aplikací pro Windows
Při instalaci původní úlohy pro C++ teď poskytujeme podrobnější prostředí instalace. Přidali jsme vybrané komponenty, které vám umožňují nainstalovat jenom nástroje, které potřebujete. Uvedené velikosti instalace komponent uvedených v uživatelském rozhraní instalačního programu jsou nesprávné a podceňují celkovou velikost.
Když chcete úspěšně vytvářet projekty Win32 v úloze vývoje desktopových aplikací v C++, musíte nainstalovat sadu nástrojů i sadu Windows SDK. Nainstalujte doporučenou (vybranou) sadu nástrojů VC++ 2017 v141 (x86, x64) a Sadu Windows 10 SDK (10.0.nnnnn), abyste měli jistotu, že funguje. Pokud nejsou nainstalované potřebné nástroje, projekty se úspěšně nevytvořily a průvodce přestane reagovat.
Visual Studio 2017 verze 15.5
Nástroje Visual C++ Build (dříve dostupné jako samostatný produkt) jsou nyní součástí úlohy v Instalační program pro Visual Studio. Tato úloha nainstaluje pouze nástroje potřebné k sestavení projektů C++ bez instalace integrovaného vývojového prostředí sady Visual Studio. Součástí jsou sady nástrojů v140 i v141. Sada nástrojů v141 obsahuje nejnovější vylepšení sady Visual Studio 2017 verze 15.5. Další informace najdete v tématu Visual Studio Build Tools nyní obsahuje sady nástrojů VS2017 a VS2015 MSVC.
Vývoj linuxových aplikací v jazyce C++
Oblíbené rozšíření Visual C++ for Linux Development je teď součástí sady Visual Studio. Tato instalace nabízí všechno, co potřebujete k vývoji a ladění aplikací v jazyce C++, které se spouštějí v prostředí systému Linux.
Visual Studio 2017 verze 15.2
Vylepšili jsme sdílení kódu napříč platformami a vizualizaci typů. Další informace najdete v tématu Vylepšení linuxového C++ pro sdílení kódu napříč platformami a vizualizaci typů.
Visual Studio 2017 verze 15.5
- Úloha Linuxu přidala podporu pro rsync jako alternativu ke sftp pro synchronizaci souborů se vzdálenými počítači s Linuxem.
- Přidává se podpora pro křížové kompilace, která cílí na mikrořadiče ARM. Pokud ho chcete povolit v instalaci, zvolte vývoj pro Linux pomocí úlohy C++ a vyberte možnost pro Embedded a IoT Development. Tato možnost přidá nástroje pro křížovou kompilaci ARM GCC a provede instalaci. Další informace naleznete v tématu ARM GCC Křížová kompilace v sadě Visual Studio.
- Byla přidána podpora pro CMake. Teď můžete pracovat na stávajícím základu kódu CMake, aniž byste ho museli převést na projekt sady Visual Studio. Další informace najdete v tématu Konfigurace projektu CMake linuxu.
- Byla přidána podpora pro spouštění vzdálených úloh. Tato funkce umožňuje spustit jakýkoli příkaz ve vzdáleném systému definovaném v Správce připojení sady Visual Studio. Vzdálené úlohy také umožňují kopírovat soubory do vzdáleného systému. Další informace najdete v tématu Konfigurace projektu CMake linuxu.
Visual Studio 2017 verze 15.7
- Různá vylepšení scénářů úloh v Linuxu Další informace naleznete v tématu Vylepšení úloh jazyka C++ linuxového systému projektu, okna konzoly Linuxu, rsync a připojení k procesu.
- IntelliSense pro hlavičky na vzdálených linuxových připojeních. Další informace najdete v tématu IntelliSense pro hlavičky vzdáleného Linuxu a konfigurace projektu CMake linuxu.
Vývoj her v jazyce C++
Využijte naplno potenciál C++ k vytváření profesionálních her využívajících technologii DirectX nebo Cocos2d.
Vývoj mobilních aplikací pomocí C++ pro Android a iOS
Mobilní aplikace teď můžete vytvářet a ladit pomocí sady Visual Studio, která se umí zaměřit i na Android a iOS.
Univerzální aplikace pro Windows
C++ je volitelnou součástí úlohy Universal Windows App. V současné době je nutné upgradovat projekty C++ ručně. V sadě Visual Studio 2017 můžete otevřít projekt cílený na Univerzální platforma Windows v140. Pokud ale nemáte nainstalovanou sadu nástrojů sady Visual Studio 2015, musíte na stránkách vlastností projektu vybrat sadu nástrojů platformy v141.
Nové možnosti jazyka C++ v Univerzální platforma Windows (UPW)
Nyní máte nové možnosti pro psaní a balení aplikací C++ pro Univerzální platforma Windows a Windows Store: Infrastruktura Přemostění na desktop umožňuje zabalíte stávající desktopovou aplikaci nebo objekt MODELU COM pro nasazení prostřednictvím Windows Storu. Nebo pro nasazení prostřednictvím stávajících kanálů prostřednictvím souběžného načítání. Nové funkce ve Windows 10 umožňují přidávat funkce UPW do desktopové aplikace různými způsoby. Další informace najdete v tématu Přemostění na desktop.
Visual Studio 2017 verze 15.5
Přidá se šablona projektu Windows Application Packaging Project, která výrazně zjednodušuje balení desktopových aplikací s Přemostění na desktop. Je k dispozici v části Soubor | Nový | Projekt | Nainstalováno | Visual C++ | Univerzální platforma Windows. Další informace najdete v tématu Zabalení aplikace pomocí sady Visual Studio (Přemostění na desktop).
Při psaní nového kódu teď můžete použít C++/WinRT, standardní projekci jazyka C++ pro prostředí Windows Runtime implementované výhradně v hlavičkových souborech. Umožňuje využívat a vytvářet prostředí Windows Runtime rozhraní API pomocí libovolného kompilátoru C++ vyhovujícího standardům. C++/WinRT je navržený tak, aby vývojářům jazyka C++ poskytoval prvotřídní přístup k modernímu rozhraní API systému Windows. Další informace najdete v tématu C++/WinRT.
Počínaje buildem 17025 sady Windows SDK Insider Preview je C++/WinRT součástí sady Windows SDK. Další informace najdete v tématu C++/WinRT, který je teď součástí sady Windows SDK.
Sada nástrojů platformy Clang/C2
Sada nástrojů Clang/C2, která se dodává se sadou Visual Studio 2017, teď podporuje /bigobj
přechod, který je zásadní pro vytváření velkých projektů. Obsahuje také několik důležitých oprav chyb, a to jak ve front-endu kompilátoru, tak v back-endu.
Analýza kódu C++
Se sadou Visual Studio se nyní distribuují moduly pro kontrolu jádra C++, které vynucují pokyny pro jádro C++. Na stránce Rozšíření analýzy kódu na stránkách vlastností projektu povolte kontrolu. Rozšíření se pak zahrnou při spuštění analýzy kódu. Další informace naleznete v tématu Použití kontroly C++ Core Guidelines.
Visual Studio 2017 verze 15.3
- Přidání podpory pro pravidla související se správou prostředků
Visual Studio 2017 verze 15.5
Nové kontroly C++ Core Guidelines zahrnují správnost inteligentních ukazatelů, správné použití globálních inicializátorů a použití příznaků použití konstruktorů, jako
goto
jsou a chybné přetypování.Některá čísla upozornění, která můžete najít ve verzi 15.3, už nejsou k dispozici ve verzi 15.5. Tato upozornění byla nahrazena specifičtějšími kontrolami.
Visual Studio 2017 verze 15.6
- Byla přidána podpora pro analýzu s jedním souborem a vylepšení výkonu za běhu analýzy. Další informace najdete v tématu Vylepšení statické analýzy C++ pro Visual Studio 2017 15.6 Preview 2
Visual Studio 2017 verze 15.7
- Přidali jsme podporu pro
/analyze:ruleset
, která vám umožní určit pravidla analýzy kódu, která se mají spustit. - Přidání podpory pro další pravidla C++ Core Guidelines Další informace naleznete v tématu Použití kontroly C++ Core Guidelines.
Testování částí v sadě Visual Studio 2017
Visual Studio 2017 verze 15.5
Adaptér Google Test Adapter a Boost.Test Adapter jsou nyní k dispozici jako komponenty desktopového vývoje s úlohou C++ . Jsou integrované s Průzkumníkem testů. Podpora CTest je přidána pro projekty CMake (pomocí otevřené složky), i když úplná integrace s Průzkumníkem testů ještě není k dispozici. Další informace naleznete v tématu Zápis testů jednotek pro C/C++.
Visual Studio 2017 verze 15.6
- Byla přidána podpora dynamické
Boost.Test
knihovny. - Šablona
Boost.Test
položky je nyní k dispozici v integrovaném vývojovém prostředí (IDE).
Další informace najdete v tématu Boost.Test
Testování částí: Podpora dynamické knihovny a šablona nové položky.
Visual Studio 2017 verze 15.7
Byla přidána podpora CodeLens pro projekty testů jednotek C++. Další informace naleznete v tématu Oznámení CodeLens pro testování částí C++.
Diagnostika grafiky sady Visual Studio
Nástroje pro diagnostiku grafiky sady Visual Studio: Pomocí nich můžete zaznamenávat a analyzovat problémy s vykreslováním a výkonem v aplikacích Direct3D. Používejte je v aplikacích, které běží místně na počítači s Windows, v emulátoru zařízení s Windows nebo na vzdáleném počítači nebo zařízení.
Vstup a výstup pro shadery vrcholů a geometrie: Schopnost zobrazit vstup a výstup shaderů vrcholů a geometrických shaderů je jednou z nejžádanějších funkcí. V nástrojích se teď podporuje. Výběrem fáze VS nebo GS v zobrazení Fáze kanálu začněte kontrolovat vstup a výstup v následující tabulce.
Vyhledávání a filtrování v tabulce objektů: Poskytuje rychlý a snadný způsob, jak najít prostředky, které hledáte.
Historie prostředků: Toto nové zobrazení poskytuje zjednodušený způsob zobrazení celé historie úprav prostředku, který byl použit při vykreslování zachyceného rámce. Pokud chcete vyvolat historii libovolného prostředku, klikněte na ikonu hodin vedle hypertextového odkazu na prostředek.
Zobrazí se nové okno nástroje Historie zdrojů s vyplněnou historií změn prostředku.
Snímky můžete zachytit s povoleným zachytáváním zásobníku celých volání. Díky tomu můžete rychle odvodit kontext každé události změny a zkontrolovat ho v rámci projektu sady Visual Studio. V dialogovém okně Možnosti sady Visual Studio Tools > v části Diagnostika grafiky nastavte možnost úplného zachytávání zásobníku.
Statistika rozhraní API: Zobrazení souhrnného souhrnu využití rozhraní API v rámci Je to užitečné pro zjišťování hovorů, které možná vůbec nesděláte, nebo volání, která děláte příliš často. Toto okno je k dispozici prostřednictvím zobrazení > statistik rozhraní API v nástroji Visual Studio Graphics Analyzer.
Statistika paměti: Podívejte se, kolik paměti ovladač přiděluje prostředkům, které vytvoříte v rámci. Toto okno je k dispozici prostřednictvím funkce Zobrazit > statistiku paměti v nástroji Visual Studio Graphics Analyzer. Pokud chcete zkopírovat data do souboru CSV pro zobrazení v tabulce, klikněte pravým tlačítkem myši a zvolte Kopírovat vše.
Ověření rámce: Seznam nových chyb a upozornění poskytuje snadný způsob, jak procházet seznam událostí na základě potenciálních problémů zjištěných vrstvou ladění Direct3D. Kliknutím na Zobrazit > ověření rámce v nástroji Visual Studio Graphics Analyzer otevřete okno. Potom kliknutím na Spustit ověření spusťte analýzu. Dokončení může trvat několik minut v závislosti na složitosti rámce.
Analýza snímků pro D3D12: Analýza snímků umožňuje analyzovat výkon volání kreslení pomocí směrovaných experimentů "what-if". Přepněte na kartu Analýza snímků a spusťte analýzu a zobrazte sestavu.
Vylepšení využití GPU: Pomocí profileru využití GPU sady Visual Studio s nástrojem GPUView nebo nástrojem WINDOWS Analyzátor výkonu (WPA) je možné provádět otevřené trasování pro podrobnější analýzu. Pokud máte nainstalovanou sadu nástrojů Windows Performance Toolkit, existují dva hypertextové odkazy: jeden pro WPA a druhý pro GPUView, v pravém dolním rohu přehledu relace.
Trasování, které otevřete v GPUView prostřednictvím tohoto odkazu, podporují synchronizované přiblížení a posouvání časové osy VS a GPUView. Zaškrtávací políčko ve VS určuje, jestli je synchronizace povolená nebo ne.