Share via


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 constexprvlož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žíval co_yield . Další informace najdete v tématu yield Klíčové slovo, které se má stát co_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

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átoru move_iterator odčítání.
  • Byl opraven tichý chybný codegen pro stavově definované alokátory definované uživatelem propagate_on_container_copy_assignment a propagate_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ýsledek distance() iterátorů z tohoto kontejneru je reprezentovatelný ve návratovém distance()typu .
  • Oprava chybějící specializace auto_ptr<void>.
  • Algoritmy for_each_n()a algoritmy generate_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žívaly npos místo max_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í futurehodnotu , protože standard vyžaduje.
  • iterator_traits<void *> bývala tvrdá chyba, protože se pokusila vytvořit void&. 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čeno noexcept.
  • 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átorem propagate_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ěte operator->()a list::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át N časy N + 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 v min(initializer_list), max(initializer_list)a minmax(initializer_list), a min_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() i rethrow_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áže std::any, a target_type()target() členské funkce std::function, a get_deleter() přítel členské funkce std::shared_ptr a std::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ísto nullptr_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á volala fputs()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ány traits::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ím move_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 a std::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žíval lock() operace.
  • Povolili jsme optimalizaci pojmenované návratové hodnoty v system_category::message()souboru .
  • conjunction a disjunction teď místo typů vytvořte instanci N + 12N + 2 typů.
  • std::function již nedochází k vytváření instancí alokátoru pro každý typ vymazat volatelný stroj, zlepšení propustnosti a snížení velikosti .obj v programech, které předávají mnoho různých lambda std::function.
  • allocator_traits<std::allocator> obsahuje ručně vložené std::allocator operace, což snižuje velikost kódu v kódu, který komunikuje std::allocator pouze prostřednictvím allocator_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í pro shrink_to_fit() a reserve() 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 a void_tna 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ými memcmpmemcpya 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_differenceset_symmetric_differencea set_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 a std::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::equala std::lexicographical_compare byli učili, jak odesílat do memset a memcmp pro std::byte a gsl::byte (a další char-like výčty a výčty tříd). Vzhledem k tomu, že std::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.

    Error List.

    Error List Filtered.

  • Přidali jsme možnost filtrovat položky seznamu členů podle typu.

    Member List Filtering.

  • 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

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 pomocí těchto souborů .json:
    • 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 souboru CppProperties.json a CMake Nastavení.json Tyto proměnné prostředí je možné využívat pomocí konfigurací ladění definovaných ve 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 soubory CMake a CppProperties.json.

  • Prostřednictvím souboru CMakeSettings.json, který je umístěný ve stejné složce jako soubor CMakeLists.txt, se podporuje další konfigurace.

    CMake Open Folder.

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

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 libovolný příkaz ve vzdáleném systému, který je definovaný v nástroji Visual Studio Připojení ion Manager. 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

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.

Screenshot of the Property Pages dialog box showing Configuration Properties > Code Analysis > General selected and a number of Core Checks listed in teh Run this rule set section.

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
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.

    Input/Output for shaders.

  • Vyhledávání a filtrování v tabulce objektů: Poskytuje rychlý a snadný způsob, jak najít prostředky, které hledáte.

    Screenshot of the Object Table section with the Type drop-down and Search text box called out.

  • 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.

    Resource history.

    Zobrazí se nové okno nástroje Historie zdrojů s vyplněnou historií změn prostředku.

    Resource history change.

    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.

    API stats.

  • 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.

    Memory stats.

  • 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.

    Frame validation.

  • 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.

    Frame analysis.

  • 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.

    GPU usage.

    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.

    GPUView.