Delen via


Nieuw voor C++ in Visual Studio 2017

Visual Studio 2017 brengt veel updates en fixes naar de C++-omgeving. We hebben meer dan 250 bugs opgelost en problemen gerapporteerd in de compiler en hulpprogramma's. Veel zijn door klanten ingediend via het rapport een probleem en bieden een suggestieopties onder Feedback verzenden. Bedankt voor het melden van fouten.

Zie Wat is er nieuw in Visual Studio 2017 voor meer informatie over wat er nieuw is in Visual Studio. Zie Wat is er nieuw voor C++ in Visual Studio 2019voor meer informatie over wat er nieuw is voor C++ in Visual Studio 2019. Zie Visual C++ Wat is er nieuw voor C++ tot en met 2015 in Visual Studio 2015 en eerdere versies.

Visual Studio 2017 C++ compiler

Verbeteringen in de naleving van C++

We hebben de C++-compiler en de standaardbibliotheek in deze release bijgewerkt met verbeterde ondersteuning voor C++11- en C++14-functies. Het bevat ook voorlopige ondersteuning voor bepaalde functies die naar verwachting in de C++17-standaard zijn. Zie C++ Conformance Improvements in Visual Studio 2017 voor gedetailleerde informatie.

Visual Studio 2017 versie 15.5

De compiler ondersteunt ongeveer 75% van de functies die nieuw zijn in C++17, waaronder gestructureerde bindingen, constexpr lambdas, if constexprinlinevariabelen, vouwexpressies en toevoegen aan noexcept het typesysteem. Deze functies zijn beschikbaar onder de /std:c++17 optie. Zie Verbeteringen in C++ Conformance in Visual Studio 2017 voor meer informatie

Visual Studio 2017 versie 15.7

De MSVC-compilerhulpprogrammaset in Visual Studio versie 15.7 voldoet nu aan de C++-standaard. Zie Aankondiging: MSVC voldoet aan de C++ Standard - en Microsoft C/C++-taalconformance voor meer informatie.

Visual Studio 2017 versie 15.8

De /experimental:preprocessor compilerswitch maakt de nieuwe experimentele MSVC-preprocessor mogelijk die uiteindelijk voldoet aan alle toepasselijke C- en C++-standaarden. Zie msVC- overzicht van nieuwe preprocessor voor meer informatie.

Nieuwe compileropties

  • /permissive-: Schakel alle strikte nalevingscompilatoropties in en schakel de meeste Microsoft-specifieke compilerextensies uit (maar niet __declspec(dllimport)bijvoorbeeld). Deze optie is standaard ingeschakeld in Visual Studio 2017 versie 15.5. De /permissive- nalevingsmodus bevat ondersteuning voor zoeken in twee fasen. Zie C++ Conformance Improvements in Visual Studio voor meer informatie.

  • /diagnostics: Hiermee kunt u de diagnostische fout of waarschuwingslocatie drie verschillende manieren weergeven: alleen het regelnummer, het regelnummer en de kolom, met een caret onder de offendingsregel met code.

  • /debug:fastlink: Schakel maximaal 30% snellere incrementele koppelingstijden (vs. Visual Studio 2015) in door niet alle foutopsporingsgegevens naar het PDB-bestand te kopiëren. Het PDB-bestand verwijst in plaats daarvan naar de foutopsporingsgegevens voor de object- en bibliotheekbestanden die worden gebruikt om het uitvoerbare bestand te maken. Bekijk de snellere C++-buildcyclus in VS '15' met /Debug:fastlink en aanbevelingen om C++-builds te versnellen in Visual Studio.

  • Visual Studio 2017 staat het gebruik toe /sdl met /await. We hebben de /RTC beperking met Coroutines verwijderd.

Visual Studio 2017 versie 15.3
  • /std:c++14 en /std:c++latest: met deze compileropties kunt u zich aanmelden voor specifieke versies van de ISO C++-programmeertaal in een project. De meeste nieuwe conceptstandaardfuncties worden bewaakt door de /std:c++latest optie.

  • /std:c++17 maakt de set C++17-functies mogelijk die door de compiler zijn geïmplementeerd. Met deze optie schakelt u de ondersteuning voor compiler en standaardbibliotheek voor functies uit na C++17: functies die zijn gewijzigd of nieuw zijn in latere versies van het werkende concept en defecte updates van de C++-standaard. Als u deze functies wilt inschakelen, gebruikt u /std:c++latest.

Codegen, beveiliging, diagnostische gegevens en versiebeheer

Deze release bevat verschillende verbeteringen in optimalisatie, het genereren van code, het versiebeheer van hulpprogramma's en diagnostische gegevens. Enkele belangrijke verbeteringen zijn:

  • Verbeterde codegeneratie van lussen: ondersteuning voor automatische vectorisatie van de verdeling van constante gehele getallen, betere identificatie van memsetpatronen.
  • Verbeterde codebeveiliging: Verbeterde emissie van bufferoverschrijding compilerdiagnose en /guard:cf beveiligt nu switchinstructies die jump tables genereren.
  • Versiebeheer: de waarde van de ingebouwde preprocessormacro _MSC_VER wordt nu monotonisch bijgewerkt bij elke update van de visual C++-toolset. Zie visual C++ compilerversie voor meer informatie.
  • Nieuwe indeling van de toolset: de compiler en gerelateerde buildhulpprogramma's hebben een nieuwe locatie en mapstructuur op uw ontwikkelcomputer. Met de nieuwe indeling kunnen naast elkaar installaties van meerdere versies van de compiler worden uitgevoerd. Zie Indeling compilerhulpprogramma's in Visual Studio 2017 voor meer informatie.
  • Verbeterde diagnostische gegevens: in het uitvoervenster wordt nu de kolom weergegeven waarin een fout optreedt. Zie Verbeteringen voor diagnostische gegevens van C++-compiler in VS 15 Preview 5 voor meer informatie.
  • Bij het gebruik van coroutines is de experimentele trefwoordopbrengst (beschikbaar onder de /await optie) verwijderd. Uw code moet worden bijgewerkt voor gebruik co_yield . Zie het trefwoord in VS 2017 voor co_yield meer informatieyield.
Visual Studio 2017 versie 15.3

Verbeteringen aan diagnostische gegevens in de compiler. Zie Diagnostische verbeteringen in Visual Studio 2017 15.3.0 voor meer informatie.

Visual Studio 2017 versie 15.5

De prestaties van Visual C++ runtime blijven verbeteren door middel van een betere gegenereerde codekwaliteit. U kunt nu gewoon uw code opnieuw compileren en uw app wordt sneller uitgevoerd. Sommige van de compileroptimalisaties zijn gloednieuw, zoals de vectorisatie van voorwaardelijke scalaire winkels, het combineren van aanroepen sin(x) en cos(x) in een nieuwe sincos(x), en het verwijderen van redundante instructies van de SSA-optimizer. Andere compileroptimalisaties zijn verbeteringen in bestaande functionaliteit, zoals: vectorizer-heuristieken voor voorwaardelijke expressies, betere lusoptimalisaties en float min/max-codegen. De linker heeft een nieuwe en snellere /OPT:ICF implementatie, wat kan leiden tot een snelheid van maximaal 9% snelheid van de koppeling en er zijn andere prestatieverbeteringen in incrementele koppeling. Zie /OPT (optimalisaties) en /INCREMENTAL (incrementeel koppelen) voor meer informatie.

De Microsoft C++-compiler ondersteunt AVX-512 van Intel. Het bevat vectorlengte-instructies die nieuwe functies in AVX-512 naar 128-bits en 256-bits brede registers brengen.

De /Zc:noexceptTypes- optie kan worden gebruikt om terug te keren naar de C++14-versie van noexcept de C++17-modus in het algemeen. Met deze optie kunt u uw broncode bijwerken zodat deze voldoet aan C++17 zonder dat u al uw throw() code tegelijk hoeft te herschrijven. Zie Dynamische uitzonderingsspecificatie verwijderen en noexcept voor meer informatie.

Visual Studio 2017 versie 15.7

Standaardbibliotheek voor C++

Verbeteringen in de juistheid

Visual Studio 2017 RTM (versie 15.0)
  • Kleine diagnostische basic_string_ITERATOR_DEBUG_LEVEL != 0 verbeteringen. Wanneer een IDL-controle wordt gettript in tekenreeksmachines, wordt nu het specifieke gedrag gerapporteerd dat de reis heeft veroorzaakt. In plaats van 'string iterator not dereferencable' krijgt u bijvoorbeeld 'cannot deference string iterator because iterator buiten het bereik (bijvoorbeeld een end iterator)'.
  • std::promise De verplaatsingstoewijzingsoperator is opgelost, waardoor code voor altijd kon worden geblokkeerd.
  • Compilerfouten opgelost met de atomic<T*> impliciete conversie naar T*.
  • pointer_traits<Ptr> detecteert Ptr::rebind<U>nu correct .
  • Er is een ontbrekende const kwalificatie in de move_iterator aftrekkingsoperator opgelost.
  • Er is een probleem opgelost met ongeldige codegen voor stateful door de gebruiker gedefinieerde allocators die propagate_on_container_copy_assignment aanvragen en propagate_on_container_move_assignment.
  • atomic<T> tolereert nu overbelast operator&().
  • Enigszins verbeterde compilerdiagnose voor onjuiste bind() aanroepen.

Er zijn meer standaardbibliotheekverbeteringen in Visual Studio 2017 RTM. Zie het C++-teamblogbericht Standard Library Fixes in VS 2017 RTM voor een volledige lijst.

Visual Studio 2017 versie 15.3
  • Standaardbibliotheekcontainers klemen nu hun max_size() in numeric_limits<difference_type>::max() plaats van de max() van size_type. Deze wijziging zorgt ervoor dat het resultaat van distance() iterators van die container kan worden weergegeven in het retourtype .distance()
  • Ontbrekende specialisatie auto_ptr<void>opgelost.
  • De for_each_n(), generate_n()en search_n() algoritmen konden eerder niet worden gecompileerd als het argument lengte geen integraal type was. Ze proberen nu niet-integrale lengten te converteren naar de iterators' difference_type.
  • normal_distribution<float> er worden geen waarschuwingen meer verzonden in de standaardbibliotheek over het verkleinen van dubbel naar float.
  • Er zijn enkele basic_string bewerkingen opgelost die worden gebruikt npos in plaats van max_size() bij het controleren op een maximale overloopgrootte.
  • condition_variable::wait_for(lock, relative_time, predicate) zou wachten op de hele relatieve tijd als er sprake was van een valse ontwaak. Nu wordt er slechts één interval van de relatieve tijd gewacht.
  • future::get() de standaard vereist, wordt nu ongeldig future.
  • iterator_traits<void *> was een harde fout omdat het probeerde te vormen void&; het wordt nu een lege struct om het gebruik van iterator_traits in "is iterator" SFINAE-voorwaarden toe te staan.
  • Sommige waarschuwingen die door Clang -Wsystem-headers zijn gerapporteerd, zijn opgelost.
  • Ook is 'uitzonderingsspecificatie in declaratie komt niet overeen met de vorige declaratie' die door Clang -Wmicrosoft-exception-specis gerapporteerd.
  • Er zijn ook waarschuwingen voor het ordenen van mem-initializer-list opgelost die zijn gerapporteerd door Clang en C1XX.
  • De niet-geordende containers verwisselen hun hash-functies of predicaten niet wanneer de containers zelf zijn gewisseld. Nu doen ze dat.
  • Veel bewerkingen voor het wisselen van containers worden nu gemarkeerd noexcept (omdat onze standaardbibliotheek nooit een uitzondering wil genereren bij het detecteren van de niet-gelijk-aan-allocatorpropagate_on_container_swap niet-gedefinieerde gedragsvoorwaarde).
  • Veel vector<bool> bewerkingen zijn nu gemarkeerd noexcept.
  • De standaardbibliotheek dwingt nu overeenkomende allocator value_type (in C++17-modus) af met een opt-out escape hatch.
  • Er zijn enkele voorwaarden opgelost waarbij zelfbereikinvoeging in basic_string de inhoud van de tekenreeksen zou worden vervormd. (Opmerking: zelfbereikinvoeging in vectoren is nog steeds verboden door de Standaard.)
  • basic_string::shrink_to_fit() wordt niet meer beïnvloed door de allocator propagate_on_container_swap.
  • std::decay verwerkt nu afschuwelijke functietypen, dat wil gezegd, functietypen die cv-qualified, ref-qualified of beide zijn.
  • Gewijzigd zijn richtlijnen voor het gebruik van de juiste hoofdlettergevoeligheid en slashes, waardoor de draagbaarheid wordt verbeterd.
  • Waarschuwing C4061 'enumerator 'enumerator' in switch van enum 'opsomming' is niet expliciet verwerkt door een caselabel. Deze waarschuwing is standaard uitgeschakeld en is opgelost als een uitzondering op het algemene beleid van de standaardbibliotheek voor waarschuwingen. (De standaardbibliotheek is /W4 schoon, maar probeert niet schoon te zijn /Wall . Veel standaardwaarschuwingen zijn ongebruikelijk luidruchtig en zijn niet bedoeld om regelmatig te worden gebruikt.)
  • Verbeterde std::list foutopsporingscontroles. Lijst met iterators controleert operator->()nu en list::unique() markeert nu iterators als ongeldig.
  • Opgeloste gebruiks-allocator metaprogramming in tuple.
Visual Studio 2017 versie 15.5
  • std::partition roept nu de predicaattijden N aan in plaats van N + 1 tijden, zoals de standaard vereist.
  • Pogingen om magic statics in versie 15.3 te voorkomen, worden hersteld in versie 15.5.
  • std::atomic<T> hoeft T niet langer standaardconstructeerbaar te zijn.
  • Heap-algoritmen die logaritmische tijd in beslag nemen, gedragen zich anders wanneer iterator-foutopsporing is ingeschakeld. Ze doen geen lineaire tijdsverklaring meer dat de invoer in feite een heap is.
  • __declspec(allocator) is nu alleen beveiligd voor C1XX, om waarschuwingen van Clang te voorkomen, die deze declspec niet begrijpt.
  • basic_string::npos is nu beschikbaar als een compilatietijdconstante.
  • std::allocator in de C++17-modus wordt nu de toewijzing van overgelijnde typen verwerkt, dat wil gezegd, typen waarvan de uitlijning groter is dan max_align_t, tenzij uitgeschakeld door /Zc:alignedNew-. Vectoren van objecten met 16-byte- of 32-byte-uitlijning worden nu correct uitgelijnd voor SSE- en AVX-instructies.

Verbeteringen in overeenstemming

  • We hebben <er een> toegevoegd, <string_view>, apply(). make_from_tuple()
  • Optioneel>, <variant> en shared_ptr::weak_type<cstdalign> toegevoegd<.
  • C++14 constexpr ingeschakeld in min(initializer_list), max(initializer_list)en , en minmax(initializer_list), max_element()en min_element(), en minmax_element().

Zie de taalconformance van Microsoft C/C++ voor meer informatie.

Visual Studio 2017 versie 15.3
  • Er zijn verschillende andere C++17-functies geïmplementeerd. Zie de taalconformancetabel van Microsoft C++ voor meer informatie.
  • Geïmplementeerd P0602R0 "variant en optioneel moet copy/move trivialiteit doorgeven".
  • De standaardbibliotheek tolereert nu officieel dat dynamische RTTI wordt uitgeschakeld via de optie /GR. Zowel dynamic_pointer_cast() als rethrow_if_nested() inherent vereisen dynamic_cast, dus de standaardbibliotheek markeert ze nu als =delete onder /GR-.
  • Zelfs wanneer dynamische RTTI is uitgeschakeld via /GR-, is 'statische RTTI' in de vorm van typeid(SomeType) nog steeds beschikbaar en worden verschillende standaardbibliotheekonderdelen gebruikt. De standaardbibliotheek biedt nu ook ondersteuning voor het uitschakelen van deze functie via /D_HAS_STATIC_RTTI=0. Met deze vlag worden std::anyook de functies, de target() functies en target_type() leden van std::function, en de functie van het get_deleter() vriendlid van std::shared_ptr en std::weak_ptr.
  • De standaardbibliotheek maakt nu gebruik van C++14 constexpr voorwaardelijke, in plaats van voorwaardelijk gedefinieerde macro's.
  • De standaardbibliotheek maakt nu intern gebruik van aliassjablonen.
  • De standaardbibliotheek gebruikt nullptr nu intern, in plaats van nullptr_t{}. (Intern gebruik van NULL is uitgeroeid. Intern gebruik van 0-as-null wordt geleidelijk opgeschoond.)
  • De standaardbibliotheek gebruikt std::move() nu intern, in plaats van stilistisch verkeerd te gebruiken std::forward().
  • Gewijzigd static_assert(false, "message") in #error message. Deze wijziging verbetert de diagnose van de compiler omdat #error de compilatie onmiddellijk wordt gestopt.
  • De standaardbibliotheek markeert functies niet meer als __declspec(dllimport). Moderne linkertechnologie vereist deze niet meer.
  • Geëxtraheerde SFINAE naar standaardsjabloonargumenten, waardoor onbelangrijke e-mail in vergelijking met retourtypen en functieargumenttypen is verminderd.
  • Foutopsporingscontroles in <willekeurige volgorde gebruiken nu de gebruikelijke machines van de standaardbibliotheek, in plaats van de interne functie_Rng_abort(), die wordt aangeroepen fputs()stderr.> De implementatie van deze functie wordt bewaard voor binaire compatibiliteit. We verwijderen deze in de volgende binaire, incompatibele versie van de standaardbibliotheek.
Visual Studio 2017 versie 15.5
  • Er zijn verschillende standaardbibliotheekfuncties toegevoegd, afgeschaft of verwijderd volgens de C++17-standaard. Zie C ++ conformanceverbeteringen in Visual Studio voor meer informatie.
  • Experimentele ondersteuning voor de volgende parallelle algoritmen:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • De handtekeningen voor de volgende parallelle algoritmen worden op dit moment toegevoegd, maar niet geparallelliseerd. Profilering heeft geen voordeel getoond bij het parallelliseren van algoritmen die alleen elementen verplaatsen of permuteren:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 versie 15.6
  • <memory_resource>
  • Grondbeginselen van bibliotheek V1
  • Toewijzing verwijderen polymorphic_allocator
  • De aftrek van klassesjabloonargumenten verbeteren
Visual Studio 2017 versie 15.7
  • Ondersteuning voor parallelle algoritmen is niet meer experimenteel
  • Een nieuwe implementatie van <filesystem>
  • Elementaire tekenreeksconversies (gedeeltelijk)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Onnodig verval voorkomen
  • Wiskundige speciale functies
  • constexpr char_traits
  • Aftrekhandleidingen voor de standaardbibliotheek

Zie de taalconformance van Microsoft C/C++ voor meer informatie.

Oplossingen voor prestaties en doorvoer

  • Overbelastingen basic_string::find(char) slechts één keer aanroepen traits::find . Voorheen werd deze geïmplementeerd als een algemene tekenreekszoekopdracht voor een tekenreeks met lengte 1.
  • basic_string::operator== controleert nu de tekenreeksgrootte voordat de inhoud van de tekenreeks wordt vergeleken.
  • Besturingskoppeling is basic_stringverwijderd, wat moeilijk was voor de compileroptimalisatie om te analyseren. Voor alle korte tekenreeksen heeft bellen reserve nog steeds een niet-nulkosten om niets te doen.
  • std::vector is gereviseerd voor juistheid en prestaties: aliasing tijdens invoeg- en emplace-bewerkingen wordt nu correct afgehandeld zoals vereist door de Standaard, de sterke uitzonderingsgarantie wordt nu geboden wanneer de Standaard via move_if_noexcept() en andere logica vereist is, en invoegen en emplace minder elementbewerkingen uitvoeren.
  • De standaardbibliotheek van C++ voorkomt nu dat null-aanwijzers worden uitgesteld.
  • Verbeterde weak_ptr::lock() prestaties.
  • Om de doorvoer van de compiler te verhogen, vermijden C++ standaardbibliotheekheaders nu declaraties voor onnodige compiler-intrinsieken.
  • Verbeterde prestaties van std::string constructors en std::wstring verplaatsconstructors met meer dan drie keer.
Visual Studio 2017 versie 15.3
  • Er is gewerkt aan interacties met noexcept, waardoor de std::atomic implementatie niet werd opgenomen in functies die gebruikmaken van Structured Exception Handling (SEH).
  • De interne _Deallocate() functie van de standaardbibliotheek is gewijzigd om te optimaliseren in kleinere code, zodat deze op meer plaatsen inline kan worden geplaatst.
  • Gewijzigd std::try_lock() in het gebruik van packuitbreiding in plaats van recursie.
  • Verbeterde het std::lock() algoritme voor het vermijden van impasses om bewerkingen te gebruiken lock() in plaats van op try_lock() alle vergrendelingen te draaien.
  • De optimalisatie van benoemde retourwaarde is ingeschakeld in system_category::message().
  • conjunction en disjunction instantiëren N + 1 nu typen, in plaats van 2N + 2 typen.
  • std::function instantieert geen allocator meer ondersteuningsmachines voor elk typegum dat kan worden aangeroepen, verbetert de doorvoer en vermindert .obj grootte in programma's die veel verschillende lambdas doorgeven aan std::function.
  • allocator_traits<std::allocator> bevat handmatig inlinebewerkingen std::allocator , waardoor de codegrootte wordt verkleind std::allocatorallocator_traits die alleen via code wordt gebruikt (dat wil gezegd in de meeste code).
  • De C++11 minimale allocator-interface wordt nu rechtstreeks verwerkt door de standaardbibliotheek die wordt aangeroepen allocator_traits , in plaats van de allocator in een interne klasse _Wrap_allocte verpakken. Deze wijziging vermindert de codegrootte die wordt gegenereerd voor allocator-ondersteuning, verbetert de mogelijkheid van de optimizer om in sommige gevallen te redeneren over standaardbibliotheekcontainers en biedt een betere foutopsporingservaring (zoals u nu het type allocator ziet, in plaats _Wrap_alloc<your_allocator_type> van in het foutopsporingsprogramma).
  • Metaprogrammering is verwijderd voor aangepaste allocator::referencetoewijzingen, die niet mogen worden aangepast. (Allocators kunnen containers gebruikmaken van uitgebreide aanwijzers, maar geen uitgebreide verwijzingen.)
  • De front-end van de compiler is geleerd om iterators voor foutopsporing uit te pakken in bereik voor lussen, waardoor de prestaties van foutopsporingsversies worden verbeterd.
  • Het basic_string interne verkleiningspad voor shrink_to_fit() en reserve() bevindt zich niet meer in het pad van het opnieuw toewijzen van bewerkingen, waardoor de code voor alle gedempte leden wordt verkleind.
  • Het basic_string interne groeipad bevindt zich niet meer in het pad van shrink_to_fit().
  • De basic_string mutatiebewerkingen worden nu meegenomen in het niet toewijzen van snel pad en het toewijzen van functies voor langzame paden, waardoor het waarschijnlijker is dat de algemene niet-hertoewijzingscase inline wordt opgenomen in bellers.
  • Met de basic_string mutatiebewerkingen worden nu opnieuw toegewezen buffers in de voorkeursstatus gemaakt in plaats van de grootte te wijzigen. Een invoeging aan het begin van een tekenreeks verplaatst bijvoorbeeld de inhoud na de invoeging precies één keer. Deze wordt naar beneden of naar de zojuist toegewezen buffer verplaatst. Het wordt niet langer twee keer verplaatst in de herlocatie, eerst naar de zojuist toegewezen buffer en vervolgens omlaag.
  • Bewerkingen die de C-standaardbibliotheek in tekenreeks> aanroepen, slaat het adres nu in <de errno cache op om herhaalde interactie met TLS te verwijderen.
  • is_pointer De implementatie is vereenvoudigd.
  • Het wijzigen van op functies gebaseerde Expressie SFINAE naar struct en void_t-gebaseerd is voltooid.
  • Standaardbibliotheekalgoritmen voorkomen nu postincrementing-iterators.
  • Er zijn afkappingswaarschuwingen opgelost bij het gebruik van 32-bits allocators op 64-bits systemen.
  • std::vector verplaatsingstoewijzing is nu efficiënter in de niet-POCMA niet-equal-allocator-case door de buffer indien mogelijk opnieuw te gebruiken.
Visual Studio 2017 versie 15.5
  • basic_string<char16_t> maakt nu gebruik van dezelfde memcmp, memcpyen vergelijkbare optimalisaties die basic_string<wchar_t> betrokken zijn.
  • Een optimalisatiebeperking die verhinderde dat functieaanwijzers inline worden weergegeven, die worden weergegeven door onze 'voorkomen dat functies worden gekopieerd' werken in Visual Studio 2015 Update 3, is omzeild, waardoor de prestaties van lower_bound(iter, iter, function pointer).
  • De overhead van iterator-foutopsporingsvolgorde van invoer naar includes, set_differenceen set_symmetric_differenceset_union is verminderd door iterators uit te pakken voordat de volgorde werd gecontroleerd.
  • std::inplace_merge slaat nu elementen over die al in positie zijn.
  • std::random_device Het bouwen maakt geen constructies meer en vernietigt vervolgens een std::string.
  • std::equal en std::partition had een jumpthreading optimalisatie pass die een iterator vergelijking opslaat.
  • Wanneer std::reverse wordt doorgegeven aanwijzers om trivially te kopiëren T, wordt het nu verzonden naar een handgeschreven vector gevectoriseerde implementatie.
  • std::fill, std::equalen std::lexicographical_compare werden geleerd hoe te verzenden naar memset en memcmp voor std::byte en gsl::byte (en andere char-like enum klassen). Omdat std::copy verzendingen worden gebruikt is_trivially_copyable, hebben ze geen wijzigingen nodig.
  • De standaardbibliotheek bevat geen lege accolades meer waarvan het enige gedrag was om typen niet-trivially-destructible te maken.

Andere bibliotheken

Ondersteuning voor opensource-bibliotheken

Vcpkg is een opensource-opdrachtregelprogramma dat het proces voor het verkrijgen en bouwen van opensource-C++ statische bibliotheken en DLLS in Visual Studio aanzienlijk vereenvoudigt. Zie vcpkg voor meer informatie.

CPPRest SDK 2.9.0

Visual Studio 2017 versie 15.5

De CPPRestSDK, een platformoverschrijdende web-API voor C++, wordt bijgewerkt naar versie 2.9.0. Zie CppRestSDK 2.9.0 is beschikbaar op GitHub voor meer informatie.

ATL

Visual Studio 2017 versie 15.5
  • Nog een andere set conformanceoplossingen voor naamzoekers
  • Bestaande verplaatsingsconstructors en toewijzingsoperatoren voor verplaatsen zijn nu correct gemarkeerd als niet-beperkend
  • Ongeldige waarschuwing C4640 over thread safe init van lokale statics in atlstr.h
  • Thread-veilige initialisatie van lokale statische gegevens is automatisch uitgeschakeld in de XP-toolset bij het gebruik van ATL om een DLL te bouwen. Nu is het niet. U kunt uw Project-instellingen toevoegen /Zc:threadSafeInit- als u geen threadveilige initialisatie wilt.

Visual C++ runtime

  • Nieuwe kop "cfguard.h" voor Control Flow Guard-symbolen.

Visual Studio 2017 C++ IDE

  • De prestaties van configuratiewijziging zijn nu beter voor systeemeigen C++-projecten en veel beter voor C++-/CLI-projecten. Wanneer een oplossingsconfiguratie voor het eerst wordt geactiveerd, is dit sneller en zijn alle latere activeringen van deze oplossingsconfiguratie bijna onmiddellijk.
Visual Studio 2017 versie 15.3
  • Verschillende wizards voor projecten en code zijn herschreven in de stijl van het dialoogvenster Handtekening.
  • De wizard Klasse toevoegen wordt nu rechtstreeks gestart. Alle andere items die hier eerder waren, zijn nu beschikbaar onder Nieuw item toevoegen>.
  • Win32-projecten bevinden zich nu onder de categorie Windows-bureaublad in het dialoogvenster Nieuw project .
  • De sjablonen voor Windows Console en Bureaubladtoepassing maken nu de projecten zonder een wizard weer te geven. Er is een nieuwe Windows-bureaubladwizard onder dezelfde categorie waarin dezelfde opties worden weergegeven als de oude wizard Win32-consoletoepassing .
Visual Studio 2017 versie 15.5

Verschillende C++-bewerkingen die gebruikmaken van de IntelliSense-engine voor het herstructureren en codenavigatie worden veel sneller uitgevoerd. De volgende getallen zijn gebaseerd op de Visual Studio Chromium-oplossing met 3500 projecten:

Eigenschap Prestatieverbetering
Naam wijzigen 5,3x
Handtekening wijzigen 4,5x
Alle verwijzingen zoeken 4,7x

C++ ondersteunt nu Ctrl+ Click Go To Definition, waardoor de muisnavigatie naar definities eenvoudig is. De Structure Visualizer van het pakket Productivity Power Tools is nu ook standaard opgenomen in het product.

IntelliSense

  • De nieuwe SQLite-database-engine wordt nu standaard gebruikt. De nieuwe engine versnelt databasebewerkingen zoals Go To Definition en Find All References. Het verbetert de initiële oplossingsparsetijd aanzienlijk. De instelling is verplaatst naar Extra > Opties > Teksteditor > C/C++ > Geavanceerd. (Het was voorheen onder ... C/C++ > Experimenteel.)

  • We hebben de prestaties van IntelliSense verbeterd voor projecten en bestanden die geen vooraf gecompileerde headers gebruiken. Er wordt een automatische vooraf gecompileerde header gemaakt voor headers in het huidige bestand.

  • We hebben foutfilters en help toegevoegd voor IntelliSense-fouten in de foutenlijst. Als u op de foutkolom klikt, kunt u filteren. Als u op de specifieke fouten klikt of op F1 drukt, wordt er een onlinezoekactie voor het foutbericht gestart.

    Foutenlijst.

    Foutenlijst gefilterd.

  • De mogelijkheid toegevoegd om items in de ledenlijst op soort te filteren.

    Filteren van ledenlijst.

  • Er is een nieuwe experimentele Predictive IntelliSense-functie toegevoegd die contextbewust filtert op wat er in de ledenlijst wordt weergegeven. Zie C++ IntelliSense-verbeteringen - Voorspellende IntelliSense en filtering voor meer informatie.

  • Met Alle verwijzingen (Shift+F12) kunt u nu eenvoudig navigeren, zelfs in complexe codebases. Het biedt geavanceerde groepering, filteren, sorteren, zoeken in resultaten en (voor sommige talen) kleuren, zodat u een duidelijk inzicht krijgt in uw verwijzingen. Voor C++bevat de nieuwe gebruikersinterface informatie over of we lezen van of we naar een variabele schrijven.

  • De functie Dot-to-Arrow IntelliSense is verplaatst van experimenteel naar geavanceerd en is nu standaard ingeschakeld. De editor bevat uitbreidingsbereiken en uitbreidingsprioriteit die is verplaatst van experimenteel naar geavanceerd.

  • De experimentele herstructureringsfuncties Change Signature en Extract Function zijn nu standaard beschikbaar.

  • Er is een experimentele functie 'Snellere projectbelasting' toegevoegd voor C++-projecten. De volgende keer dat u een C++-project opent, wordt het sneller geladen en de tijd daarna wordt het veel sneller geladen.

  • Sommige van deze functies zijn gebruikelijk voor andere talen en sommige zijn specifiek voor C++. Zie Aankondiging van Visual Studio 15 Preview 5 voor meer informatie over deze nieuwe functies.

Visual Studio 2017 versie 15.7

Niet-MSBuild-projecten met Open Folder

Visual Studio 2017 introduceert de functie Map openen. Hiermee kunt u code, bouwen en fouten opsporen in een map met broncode zonder dat u oplossingen of projecten hoeft te maken. Nu is het eenvoudiger om aan de slag te gaan met Visual Studio, zelfs als uw project geen op MSBuild gebaseerd project is. Open Folder biedt u toegang tot krachtige mogelijkheden voor codebegrip, bewerking, bouwen en foutopsporing. Ze zijn dezelfde die Visual Studio al biedt voor MSBuild-projecten. Zie Mapprojecten openen voor C++voor meer informatie.

  • Verbeteringen in de ervaring Map openen. U kunt de ervaring aanpassen via deze .json bestanden:
    • CppProperties.json om de IntelliSense- en browse-ervaring aan te passen.
    • Tasks.json om de buildstappen aan te passen.
    • Launch.json om de foutopsporingservaring aan te passen.
Visual Studio 2017 versie 15.3
  • Verbeterde ondersteuning voor alternatieve compilers en buildomgevingen zoals MinGW en Cygwin. Zie MinGW en Cygwin gebruiken met Visual C++ en Map openen voor meer informatie.
  • Er is ondersteuning toegevoegd voor het definiëren van globale en configuratiespecifieke omgevingsvariabelen in CppProperties.json en CMakeSettings.json. Deze omgevingsvariabelen kunnen worden gebruikt door foutopsporingsconfiguraties die zijn gedefinieerd in launch.vs.json en taken in tasks.vs.json. Zie Uw omgeving aanpassen met Visual C++ en Map openen voor meer informatie.
  • Verbeterde ondersteuning voor de Ninja-generator van CMake, inclusief de mogelijkheid om eenvoudig 64-bits platforms te targeten.

CMake-ondersteuning via Open Folder

Visual Studio 2017 introduceert ondersteuning voor het gebruik van CMake-projecten zonder conversie naar MSBuild-projectbestanden (.vcxproj). Zie CMake-projecten in Visual Studio voor meer informatie. Als u CMake-projecten opent met Open Folder , wordt de omgeving automatisch geconfigureerd voor C++ bewerken, bouwen en foutopsporing.

  • C++ IntelliSense werkt zonder dat u een CppProperties.json bestand in de hoofdmap hoeft te maken. Er is een nieuwe vervolgkeuzelijst toegevoegd waarmee gebruikers eenvoudig kunnen schakelen tussen configuraties van CMake en CppProperties.json bestanden.

  • Verdere configuratie wordt ondersteund via een CMakeSettings.json-bestand dat zich in dezelfde map bevindt als het CMakeLists.txt-bestand.

    Map openen in CMake.

Visual Studio 2017 versie 15.3
  • Ondersteuning toegevoegd voor de CMake Ninja generator.
Visual Studio 2017 versie 15.4
  • Ondersteuning toegevoegd voor het importeren van bestaande CMake-caches.
Visual Studio 2017 versie 15.5

Windows-bureaubladontwikkeling

We bieden nu een gedetailleerdere installatie-ervaring voor het installeren van de oorspronkelijke C++-workload. Er zijn selecteerbare onderdelen toegevoegd waarmee u alleen de hulpprogramma's kunt installeren die u nodig hebt. De aangegeven installatiegrootten voor de onderdelen in de gebruikersinterface van het installatieprogramma zijn onjuist en onderschat de totale grootte.

Als u Win32-projecten wilt maken in de C++-bureaubladworkload, moet u zowel een toolset als een Windows SDK installeren. Installeer de aanbevolen (geselecteerde) onderdelen VC++ 2017 v141 toolset (x86, x64) en Windows 10 SDK (10.0.nnnnn) om er zeker van te zijn dat deze werkt. Als de benodigde hulpprogramma's niet zijn geïnstalleerd, worden projecten niet meer gemaakt en reageert de wizard niet meer.

Visual Studio 2017 versie 15.5

De Visual C++ Build-hulpprogramma's (voorheen beschikbaar als zelfstandig product) zijn nu opgenomen als een workload in het Installatieprogramma van Visual Studio. Met deze workload worden alleen de hulpprogramma's geïnstalleerd die nodig zijn voor het bouwen van C++-projecten zonder de Visual Studio IDE te installeren. Zowel de v140- als v141-toolsets zijn inbegrepen. De v141-toolset bevat de nieuwste verbeteringen in Visual Studio 2017 versie 15.5. Zie Visual Studio Build Tools nu voor meer informatie, waaronder de MSVC Toolsets VS2017 en VS2015.

Linux-ontwikkeling met C++

De populaire extensie Visual C++ voor Linux-ontwikkeling maakt nu deel uit van Visual Studio. Deze installatie biedt alles wat u nodig hebt om C++-toepassingen te ontwikkelen en fouten op te sporen die worden uitgevoerd in een Linux-omgeving.

Visual Studio 2017 versie 15.2

Er zijn verbeteringen aangebracht in het delen van platformoverschrijdende code en het typen van visualisaties. Zie Linux C++-verbeteringen voor het delen van platformoverschrijdende code en typevisualisatie voor meer informatie.

Visual Studio 2017 versie 15.5
  • De Linux-workload heeft ondersteuning toegevoegd voor rsync als alternatief voor sftp voor het synchroniseren van bestanden naar externe Linux-machines.
  • Er wordt ondersteuning toegevoegd voor cross-compilatie die gericht is op ARM-microcontrollers. Als u deze wilt inschakelen in de installatie, kiest u de Linux-ontwikkeling met de C++ -workload en selecteert u de optie voor Embedded en IoT Development. Met deze optie worden de hulpprogramma's voor kruiscompilatie van ARM GCC toegevoegd aan uw installatie. Zie ARM GCC Cross Compilation in Visual Studio voor meer informatie.
  • Ondersteuning toegevoegd voor CMake. U kunt nu aan uw bestaande CMake-codebasis werken zonder dat u deze hoeft te converteren naar een Visual Studio-project. Zie Een Linux CMake-project configureren voor meer informatie.
  • Ondersteuning toegevoegd voor het uitvoeren van externe taken. Met deze mogelijkheid kunt u elke opdracht uitvoeren op een extern systeem dat is gedefinieerd in Visual Studio Connection Manager. Externe taken bieden ook de mogelijkheid om bestanden naar het externe systeem te kopiëren. Zie Een Linux CMake-project configureren voor meer informatie.
Visual Studio 2017 versie 15.7

Gameontwikkeling met C++

Gebruik de volledige kracht van C++ om professionele games te bouwen die mogelijk worden gemaakt door DirectX of Cocos2d.

Mobiele ontwikkeling met C++ voor Android en iOS

U kunt nu mobiele apps maken en fouten opsporen met Visual Studio die gericht kunnen zijn op Android en iOS.

Universele Windows-apps

C++ wordt geleverd als een optioneel onderdeel voor de universal Windows-app-workload. Op dit moment moet u C++-projecten handmatig upgraden. U kunt een v140-gericht Universal Windows Platform-project openen in Visual Studio 2017. U moet echter de v141-platformhulpprogramma's selecteren op de projecteigenschapspagina's als Visual Studio 2015 niet is geïnstalleerd.

Nieuwe opties voor C++ op Universal Windows Platform (UWP)

U hebt nu nieuwe opties voor het schrijven en verpakken van C++-toepassingen voor het Universeel Windows-platform en de Windows Store: met de Desktop Bridge-infrastructuur kunt u uw bestaande bureaubladtoepassing of COM-object verpakken voor implementatie via de Windows Store. Of voor implementatie via uw bestaande kanalen via sideloading. Met nieuwe mogelijkheden in Windows 10 kunt u uwP-functionaliteit op verschillende manieren toevoegen aan uw bureaubladtoepassing. Zie Desktop Bridge voor meer informatie.

Visual Studio 2017 versie 15.5

Er wordt een projectsjabloon voor Windows Application Packaging Project toegevoegd, waardoor het verpakken van bureaubladtoepassingen met Desktop Bridge aanzienlijk wordt vereenvoudigd. Deze is beschikbaar onder Bestand | Nieuw | Project | Geïnstalleerd | Visual C++ | Universeel Windows-platform. Zie Een app verpakken met Behulp van Visual Studio (Desktop Bridge) voor meer informatie.

Wanneer u nieuwe code schrijft, kunt u nu C++/WinRT gebruiken, een standaard C++-taalprojectie voor de Windows Runtime die alleen in headerbestanden is geïmplementeerd. Hiermee kunt u Windows Runtime-API's gebruiken en ontwerpen met behulp van een standaardenconforme C++-compiler. C++/WinRT is ontworpen om C++-ontwikkelaars eersteklas toegang te bieden tot de moderne Windows-API. Zie C++/WinRT voor meer informatie.

Vanaf build 17025 van de Windows SDK Insider Preview is C++/WinRT opgenomen in de Windows SDK. Zie C++/WinRT is nu opgenomen in de Windows SDK voor meer informatie.

De platformhulpprogrammaset voor Clang/C2

De Clang/C2-toolset die wordt geleverd met Visual Studio 2017 ondersteunt nu de switch, die cruciaal is voor het /bigobj bouwen van grote projecten. Het bevat ook verschillende belangrijke bugfixes, zowel in de front-end- als de back-end van de compiler.

C++ codeanalyse

De C++ Core Checkers voor het afdwingen van de C++-kernrichtlijnen worden nu gedistribueerd met Visual Studio. Schakel de controles in op de pagina Code Analysis Extensions op de eigenschappenpagina's van het project. De extensies worden vervolgens opgenomen wanneer u codeanalyse uitvoert. Zie C++ Core Guidelines checkers gebruiken voor meer informatie.

Schermopname van het dialoogvenster Eigenschappenpagina's met configuratie-eigenschappen > Codeanalyse > Algemeen geselecteerd en een aantal kerncontroles vermeld in de sectie Deze regelset uitvoeren.

Visual Studio 2017 versie 15.3
  • Ondersteuning toegevoegd voor regels met betrekking tot resourcebeheer.
Visual Studio 2017 versie 15.5
  • Nieuwe C++ Core Guidelines-controles hebben betrekking op de juistheid van slimme aanwijzers, het juiste gebruik van globale initialisatieprogramma's en het markeren van constructies zoals goto en slechte casts.

  • Sommige waarschuwingsnummers die u in 15.3 kunt vinden, zijn niet meer beschikbaar in 15,5. Deze waarschuwingen zijn vervangen door specifiekere controles.

Visual Studio 2017 versie 15.6
Visual Studio 2017 versie 15.7
  • Ondersteuning toegevoegd voor /analyze:ruleset, waarmee u de codeanalyseregels kunt opgeven die moeten worden uitgevoerd.
  • Ondersteuning toegevoegd voor meer regels voor C++-kernrichtlijnen. Zie C++ Core Guidelines checkers gebruiken voor meer informatie.

Eenheidstests in Visual Studio 2017

Visual Studio 2017 versie 15.5

Google Test Adapter en Boost.Test Adapter zijn nu beschikbaar als onderdelen van de desktopontwikkeling met C++ -workload. Ze zijn geïntegreerd met Test Explorer. CTest-ondersteuning wordt toegevoegd voor CMake-projecten (met behulp van open map), hoewel volledige integratie met Test Explorer nog niet beschikbaar is. Zie Schrijfeenheidtests voor C/C++ voor meer informatie.

Visual Studio 2017 versie 15.6
  • Ondersteuning toegevoegd voor Boost.Test dynamische bibliotheekondersteuning.
  • Een Boost.Test itemsjabloon is nu beschikbaar in de IDE.

Zie Boost.Test Eenheidstests: ondersteuning voor dynamische bibliotheken en nieuwe itemsjabloon voor meer informatie.

Visual Studio 2017 versie 15.7

CodeLens-ondersteuning toegevoegd voor C++-eenheidstestprojecten. Zie CodeLens voor C++ Unit Testing aankondigen voor meer informatie.

Diagnostische gegevens over Visual Studio-afbeeldingen

Visual Studio Graphics Diagnostics-hulpprogramma's: u kunt ze gebruiken om rendering- en prestatieproblemen in Direct3D-apps vast te leggen en te analyseren. Gebruik ze in apps die lokaal worden uitgevoerd op uw Windows-pc, in een Windows-apparaatemulator of op een externe pc of apparaat.

  • Invoer en uitvoer voor hoekpunt- en geometrie-shaders: De mogelijkheid om invoer en uitvoer van hoekpunt-shaders en geometrie-shaders weer te geven, is een van de meest aangevraagde functies. Deze wordt nu ondersteund in de hulpprogramma's. Selecteer de VS- of GS-fase in de weergave Pijplijnfasen om te beginnen met het inspecteren van de invoer en uitvoer in de onderstaande tabel.

    Invoer/uitvoer voor shaders.

  • Zoeken en filteren in de objecttabel: Biedt een snelle en eenvoudige manier om de resources te vinden die u zoekt.

    Schermopname van de sectie Objecttabel met het tekstvak Type en Zoeken gemarkeerd.

  • Resourcegeschiedenis: Deze nieuwe weergave biedt een gestroomlijnde manier om de volledige wijzigingsgeschiedenis van een resource te zien, omdat deze werd gebruikt tijdens het weergeven van een vastgelegd frame. Als u de geschiedenis voor een resource wilt aanroepen, klikt u op het klokpictogram naast een resourcehyperlink.

    Resourcegeschiedenis.

    Hiermee wordt het nieuwe venster Resourcegeschiedenis weergegeven, gevuld met de wijzigingsgeschiedenis van de resource.

    Wijziging van resourcegeschiedenis.

    U kunt frames vastleggen waarvoor het vastleggen van de volledige aanroepstack is ingeschakeld. Hiermee kunt u snel de context van elke wijzigingsevenement afleiden en deze inspecteren in uw Visual Studio-project. Stel de optie voor volledige stackopname in het dialoogvenster Opties voor Visual Studio Tools > onder Graphics Diagnostics in.

  • API-statistieken: Bekijk een overzicht op hoog niveau van API-gebruik in uw frame. Het is handig voor het detecteren van gesprekken die u mogelijk helemaal niet realiseert of oproepen die u maakt te vaak. Dit venster is beschikbaar via View > API Statistics in Visual Studio Graphics Analyzer.

    API-statistieken.

  • Geheugenstatistieken: Bekijk hoeveel geheugen het stuurprogramma toewijst voor de resources die u in het frame maakt. Dit venster is beschikbaar via Geheugenstatistieken weergeven > in Visual Studio Graphics Analyzer. Als u gegevens wilt kopiëren naar een CSV-bestand voor weergave in een spreadsheet, klikt u met de rechtermuisknop en kiest u Alles kopiëren.

    Geheugenstatistieken.

  • Framevalidatie: De nieuwe lijst met fouten en waarschuwingen biedt een eenvoudige manier om door uw lijst met gebeurtenissen te navigeren op basis van mogelijke problemen die zijn gedetecteerd door de Direct3D-foutopsporingslaag. Klik op Framevalidatie weergeven > in Visual Studio Graphics Analyzer om het venster te openen. Klik vervolgens op Validatie uitvoeren om de analyse te starten. Het kan enkele minuten duren, afhankelijk van de complexiteit van het frame.

    Framevalidatie.

  • Frameanalyse voor D3D12: Gebruik Frameanalyse om draw-call-prestaties te analyseren met gerichte 'what-if'-experimenten. Ga naar het tabblad Frameanalyse en voer analyse uit om het rapport weer te geven.

    Frameanalyse.

  • Verbeteringen in GPU-gebruik: Open traceringen kunnen worden uitgevoerd via de Visual Studio GPU Usage Profiler met GPUView of het hulpprogramma Windows Performance Analyzer (WPA) voor gedetailleerdere analyse. Als u de Windows Performance Toolkit hebt geïnstalleerd, zijn er twee hyperlinks: een voor WPA en een voor GPUView, rechtsonder in het sessieoverzicht.

    GPU-gebruik.

    Traceringen die u opent in GPUView via deze koppeling ondersteunen gesynchroniseerde VS- en GPUView-tijdlijnzooms en pannen. Een selectievakje in VS bepaalt of synchronisatie is ingeschakeld of niet.

    GPUView.