Freigeben über


Neuerungen bei C++ in Visual Studio 2017

Visual Studio 2017 RC enthält viele Updates und Problembehebungen der C++-Umgebung. Es wurden mehr als 250 Fehler und Probleme mit dem Compiler sowie mit Tools behoben. Viele dieser Probleme wurden von Kunden über die Optionen Problem melden und „Vorschlag senden“ unter Feedback senden übermittelt. Vielen Dank für das Melden von Fehlern!

Weitere Informationen zu Neuerungen in Visual Studio finden Sie unter Neuerungen in Visual Studio 2017. Weitere Informationen zu Neuerungen für C++ in Visual Studio 2019 finden Sie unter Neuerungen bei C++ in Visual Studio. Weitere Informationen zu Neuerungen für C++ in Visual Studio 2015 und frühere Versionen finden Sie unter Visual C++: Neuerungen von 2003 bis 2015. Weitere Informationen zu den Neuerungen in der C++-Dokumentation finden Sie unter Microsoft C++-Dokumentation: Neuigkeiten.

Visual Studio 2017 C++-Compiler

Verbesserungen an C++ bei der Übereinstimmung mit Standards

Der C++-Compiler und die Standardbibliothek wurden in diesem Release mit verbesserter Unterstützung für C++11- und C++14-Funktionen aktualisiert. Diese Verbesserungen schließen auch vorläufige Unterstützung für bestimmte Features ein, deren Implementierung im C++17-Standard erwartet wird. Ausführliche Informationen finden Sie unter Verbesserungen bei der Übereinstimmung mit C++-Standards in Visual C++ 2017.

Visual Studio 2017 Version 15.5

Der Compiler unterstützt ungefähr 75 % der Features, die neu in C++17 sind (z.B. strukturierte Bindungen, constexpr-Lambdaausdrücke, if constexpr, Inlinevariablen, „fold“-Ausdrücke und das Hinzufügen von noexcept zum Typsystem). Diese Features sind unter der Option /std:c++17 verfügbar. Weitere Informationen finden Sie unter Verbesserungen bei der Übereinstimmung mit C++-Standards in Visual Studio 2017.

Visual Studio 2017-Version 15.7

Das MSVC-Compilertoolset in Visual Studio-Version 15.7 erfüllt nun den C++-Standard. Weitere Informationen finden Sie unter Announcing: MSVC Conforms to the C++ Standard (Ankündigung: MSVC erfüllt den C++-Standard) und Microsoft C/C++-Sprachkonformität.

Visual Studio 2017 Version 15.8

Mit der Compileroption /experimental:preprocessor wird der neue experimentelle MSVC-Präprozessor aktiviert, der letztendlich mit allen gültigen C- und C++-Standards konform sein wird. Weitere Informationen finden Sie unter Übersicht zum neuen MSVC-Präprozessor.

Neue Compileroptionen

  • /permissive-: Aktiviert alle strikten Compileroptionen für die Übereinstimmung mit Standards und deaktiviert die meisten Microsoft-spezifischen Compilererweiterungen (aber z.B. nicht __declspec(dllimport)). Diese Option ist in Visual Studio 2017-Version 15.5 standardmäßig aktiviert. Der Konformitätsmodus /permissive- schließt Unterstützung für die Zweiphasen-Namenssuche ein. Weitere Informationen finden Sie unter C++ Conformance Improvements in Visual Studio (Verbesserungen bei der Übereinstimmung mit C++-Standards in Visual Studio).

  • /diagnostics: Aktiviert die Anzeige des Orts, an dem der Diagnosefehler oder die Warnung aufgetreten ist. Dabei sind drei Möglichkeiten verfügbar: nur die Zeilennummer, die Zeilennummer und die Spalte oder die Zeilennummer und die Spalte mit einem Caretzeichen unter der Codezeile, in der der Fehler oder die Warnung gefunden wurde.

  • /debug:fastlink: Ermöglicht um bis zu 30 % schnellere inkrementelle Verknüpfungszeiten (im Vergleich mit Visual Studio 2015), indem nicht alle Debuginformationen in die PDB-Datei kopiert werden. Die PDB-Datei zeigt stattdessen auf die Debuginformationen für das Objekt und die Bibliotheksdateien, die zum Erstellen der ausführbaren Datei verwendet wurden. Weitere Informationen finden Sie in den Blogbeiträgen Faster C++ build cycle in VS "15" with /Debug:fastlink (Schnellerer C++-Buildzyklus in VS „15“ mit /Debug:fastlink) und Recommendations to speed C++ builds in Visual Studio (Empfehlungen zum Beschleunigen von C++-Builds in Visual Studio).

  • Visual Studio 2017 ermöglicht die Verwendung von /sdl mit /await. Die /RTC-Einschränkung mit Coroutinen wurde beseitigt.

Visual Studio 2017 Version 15.3
  • /std:c++14 und /std:c++latest: Diese Compileroptionen ermöglichen Ihnen das Verwenden bestimmter Versionen der Programmiersprache ISO C++ in einem Projekt. Die meisten Standardfeatures des neuen Entwurfs werden von der Option /std:c++latest geschützt.

  • /std:c++17 aktiviert die C++17-Features, die vom Compiler implementiert werden. Diese Option deaktiviert die Unterstützung von Compiler- und Standardbibliotheken für Features, die nach C++17 veröffentlicht wurden: Versionen des Arbeitsentwurfs und Fehlerbehebungsaktualisierungen des C++-Standards, die in späteren Versionen geändert wurden oder neu sind. Verwenden Sie zum Aktivieren dieser Funktionen /std:c++latest .

Codegenerierung, Sicherheit, Diagnosen und Versionsverwaltung

Dieses Release bietet mehrere Verbesserungen hinsichtlich Optimierung, Codegenerierung, Versionsverwaltung für das Toolset sowie Diagnose. Zu diesen Verbesserungen gehören folgende:

  • Verbesserte Generierung von Code für Schleifen: Unterstützung der automatischen Vektorisierung der Division von konstanten Integerwerten und verbesserte Erkennung von memset-Mustern.
  • Verbesserte Codesicherheit: Verbesserte Ausgabe der Compilerdiagnose eines Pufferüberlaufs. /guard:cf schützt jetzt switch-Anweisungen, die Sprungtabellen generieren.
  • Versionsverwaltung: Der Wert des integrierten Präprozessormakros _MSC_VER wird nun bei jedem Update des Visual C++-Toolsets monoton aktualisiert. Weitere Informationen finden Sie unter Visual C++-Compilerversion.
  • Neues Layout des Toolsets: Der Compiler und verwandte Buildtools haben auf dem Entwicklungscomputer einen neuen Speicherort und eine neue Verzeichnisstruktur. Das neue Layout ermöglicht die parallele Installation mehrerer Versionen des Compilers. Weitere Informationen finden Sie unter Layout der Compilertools in Visual Studio 2017.
  • Verbesserte Diagnose: Das Ausgabefenster zeigt jetzt die Spalte an, in der ein Fehler auftritt. Weitere Informationen finden Sie im Blogbeitrag C++ compiler diagnostics improvements in VS „15“ Preview 5.
  • Bei Verwendung von Coroutinen wurde das experimentelle Schlüsselwort yield (verfügbar unter der Option /await) entfernt. Der Code sollte so aktualisiert werden, dass stattdessen co_yield verwendet wird. Weitere Informationen finden Sie im Schlüsselwort yield, das in VS 2017 co_yield wird.
Visual Studio 2017 Version 15.3

Verbesserungen der Diagnose im Compiler. Weitere Informationen finden Sie unter Diagnostic Improvements in Visual Studio 2017 15.3.0 (Verbesserungen bei der Diagnose in Visual Studio 2017 15.3.0).

Visual Studio 2017 Version 15.5

Die Visual C++-Laufzeitleistung wird weiterhin durch eine besser generierte Codequalität verbessert. Jetzt können Sie Ihren Code einfach neu kompilieren, und Ihre App wird schneller ausgeführt. Einige der Compileroptimierungen sind brandneu, z.B. die Vektorisierung von bedingten skalaren Speichern, die Kombination der Aufrufe sin(x) und cos(x) in einem neuen Aufruf sincos(x) und die Beseitigung von redundanten Anweisungen aus dem SSA-Optimierer. Weitere Compileroptimierungen sind Verbesserungen an bestehenden Funktionen wie Vektorisierungsheuristiken für bedingte Ausdrücke, bessere Schleifenoptimierungen und float min/max codegen. Der Linker verfügt über eine neue und schnellere /OPT:ICF -Implementierung, die die Linkzeit um bis zu 9 % beschleunigen kann, und es sind weitere Leistungsoptimierungen für „inkrementelles Verknüpfen“ vorhanden. Weitere Informationen finden Sie unter /OPT (Optimierungen) und /INCREMENTAL (inkrementelles Verknüpfen).

Der Microsoft C++-Compiler bietet Unterstützung für AVX-512 von Intel. Er verfügt über Anweisungen zur Vektorlänge, die neue Funktionen in AVX-512 für 128 und 256 Bit breite Register bereitstellen.

Mithilfe der Option /Zc:noexceptTypes- können Sie zur C++14-Version von noexcept zurückkehren, im Übrigen jedoch den C++17-Modus beibehalten. Diese Option ermöglicht es Ihnen, Ihren Quellcode zu aktualisieren, um ihn an C++17 anzupassen, ohne dass Sie Ihren gesamten throw()-Code zur gleichen Zeit neu schreiben müssen. Weitere Informationen dazu finden Sie unter Entfernen der dynamischen Ausnahmespezifikation und noexcept.

Visual Studio 2017-Version 15.7

C++-Standardbibliothek

Verbesserungen der Richtigkeit

Visual Studio 2017 RTM (Version 15.0)
  • Kleinere Verbesserungen bei der Diagnose von basic_string_ITERATOR_DEBUG_LEVEL != 0. Beim Auslösen einer IDL-Überprüfung in einem Zeichenfolgenmechanismus wird nun das Verhalten gemeldet, das die Überprüfung ausgelöst hat. Anstelle von „Zeichenfolgeniterator nicht dereferenzierbar“ wird „Zeichenfolgeniterator ist nicht dereferenzierbar, da er sich außerhalb des Bereichs befindet (z. B. ein Enditerator)“ angezeigt.
  • Der Bewegungszuweisungsoperator std::promise, der zuvor zum dauerhaften Blockieren von Code führen konnte, wurde korrigiert.
  • Compilerfehler bei der impliziten Konvertierung von atomic<T*> in T* wurden behoben.
  • pointer_traits<Ptr> erkennt jetzt ordnungsgemäß Ptr::rebind<U>.
  • Ein fehlender const-Qualifizierer im move_iterator-Subtraktionsoperator wurde behoben.
  • Die lautlose, ungültige Codegenerierung für zustandsbehaftete benutzerdefinierte Allokatoren, die propagate_on_container_copy_assignment und propagate_on_container_move_assignment anfordern, wurde korrigiert.
  • atomic<T> toleriert nun den überladenen operator&().
  • Compilerdiagnosen für falsche bind()-Aufrufe wurden leicht verbessert.

Es sind weitere Verbesserungen an der Standardbibliothek in Visual Studio 2017 RTM verfügbar. Eine vollständige Liste finden Sie im C++-Teamblogeintrag Standard Library Fixes In VS 2017 RTM (Behobene Probleme in der Standardbibliothek in VS 2017 RTM).

Visual Studio 2017 Version 15.3
  • Standardbibliothekscontainer binden nun ihre max_size() an numeric_limits<difference_type>::max(), anstatt max() an size_type. Dadurch wird sichergestellt, dass das Ergebnis von distance() in Iteratoren von diesem Container im Rückgabetyp von distance() darstellbar ist.
  • Fehlende Spezialisierung wurde behoben: auto_ptr<void>.
  • Bei den Algorithmen for_each_n(), generate_n() und search_n() war in der Vergangenheit keine Kompilierung möglich, wenn es sich beim Längenargument nicht um einen integralen Typ handelte. Es wird nun versucht, nicht integrale Längen in einen difference_type des Iterators umzuwandeln.
  • normal_distribution<float> gibt in der Standardbibliothek beim Einschränken von double auf float keine Warnungen mehr aus.
  • Einige basic_string-Vorgänge wurden korrigiert, bei denen bei Überprüfung der maximalen Überlaufgröße npos anstatt max_size() verwendet wurde.
  • condition_variable::wait_for(lock, relative_time, predicate) wartete bisher bei einer fälschlicherweise erfolgten Aktivierung die gesamte relative Zeit. Es wird nun nur für ein einzelnes Intervall der relativen Zeit gewartet.
  • future::get() macht jetzt das future-Objekt ungültig, so wie es der Standard erfordert.
  • iterator_traits<void *> war zuvor ein harter Fehler, weil versucht wurde, void& zu formen. Es wird jetzt zu einer leeren Struktur, um die Verwendung von iterator_traits in "is iterator" SFINAE-Bedingungen zuzulassen.
  • Einige von Clang -Wsystem-headers gemeldete Warnungen wurden behoben.
  • Außerdem wurde die von Clang -Wmicrosoft-exception-spec gemeldete Fehlermeldung „exception specification in declaration does not match previous declaration“ (Ausnahmespezifikation in der Deklaration stimmt nicht mit vorheriger Deklaration überein) behoben.
  • Von Clang und C1XX gemeldete mem-initializer-list-Reihenfolgewarnungen wurden ebenfalls korrigiert.
  • Die unsortierten Container tauschten ihre Hashfunktionen oder Prädikate nicht, wenn die Container selbst getauscht wurden. Dies erfolgt jetzt.
  • Viele swap-Vorgänge von Containern sind jetzt als noexcept markiert, da die Standardbibliothek niemals eine Ausnahme auslöst, wenn sie die nicht definierte Verhaltensbedingung „non-propagate_on_container_swap non-equal-allocator“ erkennt.
  • Viele vector<bool>-Vorgänge sind jetzt als noexcept gekennzeichnet.
  • Die Standardbibliothek erzwingt jetzt den Abgleich von value_type (im C++17-Modus) mit einem Escapehatch für die Deaktivierung.
  • Einige Bedingungen wurden korrigiert, bei denen „self-range-insert“ in basic_string den Inhalt der Zeichenfolge durcheinandergebracht hat. (Hinweis: „self-range-insert“ in Vektoren ist im Standard immer noch nicht zulässig.)
  • basic_string::shrink_to_fit() wird nicht länger vom propagate_on_container_swap der Zuweisung beeinträchtigt.
  • std::decay verarbeitet jetzt abominable-Funktionstypen (also Funktionstypen mit cv- und/oder ref-Qualifizierer).
  • include-Direktiven wurden geändert und verwenden jetzt die richtige Groß- und Kleinschreibung und Schrägstriche, was die Portierbarkeit verbessert.
  • Die Warnung C4061 „Der Enumerator „enumerator“ im Schalter der Enumeration „enumeration“ wird von keiner Fallbezeichnung explizit behandelt“ wurde korrigiert. Diese Warnung ist standardmäßig deaktiviert und wurde als Ausnahme der allgemeinen Richtlinie der Standardbibliothek für Warnungen korrigiert. (Die Standardbibliothek ist /W4-bereinigt, versucht jedoch nicht, /Wall-bereinigt zu sein. Viele standardmäßig deaktivierte Warnungen sind ungewöhnlich auffällig und sollen nicht regelmäßig verwendet werden.)
  • Verbesserte std::list-Debugüberprüfungen. Listeniteratoren überprüfen jetzt operator->(), und list::unique() markiert Iteratoren jetzt als ungültig.
  • Die Metaprogrammierung von „uses-allocator“ wurde im tuple korrigiert.
Visual Studio 2017 Version 15.5
  • std::partition ruft nun in Übereinstimmung mit dem Standard das Prädikat N Mal anstatt N + 1 Mal auf.
  • Versuche, statische Magic-Befehle in Version 15.3 zu vermeiden, wurden in Version 15.5 repariert.
  • std::atomic<T> erfordert nicht mehr, dass T standardmäßig konstruierbar ist.
  • Heapalgorithmen, die die logarithmische Zeit nutzen, weisen ein anderes Verhalten auf, wenn das Iteratordebugging aktiviert ist. Es erfolgt keine Assertion der linearen Zeit zur Bestimmung, dass es sich bei der Eingabe tatsächlich um einen Heap handelt.
  • __declspec(allocator) wird jetzt nur noch für C1XX geschützt, um Warnungen des Compiler-Front-Ends Clang zu verhindern, das diesen Modifizierer von declspec nicht versteht.
  • basic_string::npos ist nun als Kompilierzeitkonstante verfügbar.
  • std::allocator verarbeitet nun im C++17-Modus ordnungsgemäß die Speicherbelegung von überausgerichteten Typen, also von Typen, deren Ausrichtung größer als max_align_t ist (sofern keine Deaktivierung durch /Zc:alignedNew- erfolgt). Vektoren von Objekten mit 16- oder 32-Byte-Ausrichtung werden z.B. nun ordnungsgemäß für SSE- und AVX-Anweisungen ausgerichtet.

Verbesserungen bei der Übereinstimmung mit Standards

  • Wir haben <any>, <string_view>, apply() und make_from_tuple() hinzugefügt.
  • Es wurden <optional>, <variant>, shared_ptr::weak_type, und <cstdalign> hinzugefügt.
  • C++14 constexpr wurde in min(initializer_list), max(initializer_list) und minmax(initializer_list) und min_element(), max_element() und minmax_element() hinzugefügt.

Weitere Informationen finden Sie unter Microsoft C/C++-Sprachkonformität.

Visual Studio 2017 Version 15.3
  • Es wurden mehrere weitere C++17-Features implementiert. Weitere Informationen finden Sie unter Microsoft C++-Sprachkonformität: Tabelle.
  • P0602R0 wurde implementiert: „variant and optional should propagate copy/move triviality“.
  • Die Standardbibliothek toleriert jetzt offiziell das Deaktivieren dynamischer RTTI über die Option /GR-. dynamic_pointer_cast() und rethrow_if_nested() erfordern grundsätzlich dynamic_cast . Daher kennzeichnet die Standardbibliothek sie jetzt unter /GR- als =delete.
  • Auch wenn dynamische RTTI über /GR- deaktiviert wurde, ist statische RTTI (in Form von typeid(SomeType)) weiterhin verfügbar und unterstützt verschiedene Komponenten der Standardbibliothek. Die Standardbibliothek unterstützt über /D_HAS_STATIC_RTTI=0 jetzt auch die Deaktivierung der statischen RTTI. Durch diese Flag werden std::any, die Memberfunktionen target() und target_type() von std::function sowie die Friend-Memberfunktionen get_deleter() von std::shared_ptr und std::weak_ptr deaktiviert.
  • Die Standardbibliothek verwendet jetzt „C++14 constexpr“ bedingungslos anstelle von bedingt definierten Makros.
  • Die Standardbibliothek verwendet jetzt intern Aliasvorlagen.
  • Die Standardbibliothek verwendet jetzt intern nullptr anstelle von nullptr_t{}. (Die interne Nutzung von NULL wird beseitigt. Die interne Nutzung von „0-as-null“ wird nach und nach bereinigt.)
  • Die Standardbibliothek verwendet jetzt intern std::move() anstelle der stilistisch fehlerhaften Verwendung von std::forward().
  • static_assert(false, "message") wurde in #error message geändert. Dies verbessert die Compilerdiagnose, da #error die Kompilierung sofort beendet.
  • Die Standardbibliothek markiert Funktionen nicht mehr als __declspec(dllimport). Für moderne Linkertechnologien ist dies nicht mehr erforderlich.
  • SFINAE wurde in Standardvorlagenargumente extrahiert, wodurch der Code im Vergleich zu Rückgabetypen und Funktionsargumenttypen übersichtlicher wurde.
  • <Zufällige> Debugüberprüfungen verwenden jetzt die üblichen Mechanismen der Standardbibliothek anstelle der internen Funktion _Rng_abort(), die fputs() für stderr aufgerufen hat. Die Implementierung dieser Funktion wird für Binärkompatibilität beibehalten. Sie wird in der nächsten binärinkompatiblen Version der Standardbibliothek entfernt.
Visual Studio 2017 Version 15.5
  • Mehrere Features der Standardbibliothek wurden in Übereinstimmung mit dem C++17-Standard hinzugefügt, als veraltet markiert oder entfernt. Weitere Informationen finden Sie unter C++ Conformance Improvements in Visual Studio (Verbesserungen bei der Übereinstimmung mit C++-Standards in Visual Studio).
  • Experimentelle Unterstützung für die folgenden parallelen Algorithmen:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • Die Signaturen für die folgenden parallelen Algorithmen werden hinzugefügt, aktuell jedoch nicht parallelisiert. Bei der Profilerstellung wurden durch die Parallelisierung von Algorithmen, mit denen Elemente lediglich verschoben oder permutiert werden, keine Vorteile ermittelt:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 Version 15.6
  • <memory_resource>
  • Bibliotheksgrundlagen V1
  • Löschen der polymorphic_allocator-Zuweisung
  • Verbesserung der Klassenvorlagenargumentableitung
Visual Studio 2017-Version 15.7
  • Unterstützung für parallele Algorithmen ist nicht mehr experimentell
  • Eine neue Implementierung von <filesystem>
  • Elementare Zeichenfolgenkonvertierungen (partiell)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Vermeiden unnötigen Verfalls
  • Mathematische spezielle Funktionen
  • constexpr char_traits
  • Herleitungsregelwerk für die Standardbibliothek

Weitere Informationen finden Sie unter Microsoft C/C++-Sprachkonformität.

Korrekturen für Leistung und Durchsatz

  • Vorgenommene basic_string::find(char)-Überladungen rufen traits::find nur einmalig auf. Dies wurde zuvor als eine allgemeine Zeichenfolgensuche nach einer Zeichenfolge der Länge 1 implementiert.
  • basic_string::operator== überprüft nun die Größe der Zeichenfolge, bevor der Inhalt der Zeichenfolge verglichen wird.
  • Die Kontrollkopplung in basic_string, die für den Compileroptimierer schwer zu analysieren war, wurde entfernt. Bei kurzen Zeichenfolgen verursacht der Aufruf von reserve auch dann Kosten, wenn keine Arbeit erledigt wird.
  • std::vector wurde aus Leistungsgründen und zur Sicherstellung der korrekten Funktionsweise überholt. Das Aliasing während des Einfügens bzw. während des Neuerstellens und Einfügens (Emplacement) wird nun korrekt entsprechend des Standards durchgeführt. Die starke Ausnahmegarantie wird nun bereitgestellt, wenn dies laut Standard über move_if_noexcept() oder über eine andere Logik erforderlich ist. Beim Einfügen bzw. Neuerstellen und Einfügen werden weniger Elementvorgänge durchgeführt.
  • Die C++-Standardbibliothek vermeidet nun die Dereferenzierung von Fancy Pointern des Typs NULL.
  • Verbesserte weak_ptr::lock()-Leistung.
  • Header der C++-Standardbibliothek vermeiden nun das Einschließen von Deklarationen für unnötige intrinsische Compilerfunktionen, um den Compilerdurchsatz zu erhöhen.
  • Die Leistung des Bewegungskonstruktors von std::string und std::wstring wurde um mehr als das Dreifache verbessert.
Visual Studio 2017 Version 15.3
  • Für Interaktionen mit noexcept, die ein Einbetten der std::atomic-Implementierung in Funktionen verhindert haben, die die strukturierte Ausnahmebehandlung verwenden, wurde eine Problemumgehung eingeführt.
  • Die interne _Deallocate()-Funktion der Standardbibliothek wurde in kleinere Codeabschnitte optimiert, sodass sie jetzt inline an mehr Stellen eingebettet werden kann.
  • std::try_lock() wurde geändert und verwendet jetzt Paketerweiterung anstelle von Rekursion.
  • Der Algorithmus von std::lock() zum Verhindern von Deadlocks wurde verbessert und verwendet jetzt lock()-Vorgänge, anstatt alle try_lock() auf allen Sperren zu durchlaufen.
  • Die Optimierung von benannten Rückgabewerten in system_category::message() wurde aktiviert.
  • conjunction und disjunction instanziieren jetzt N + 1-Typen anstatt 2N + 2-Typen.
  • std::function instanziiert den Mechanismus für die Zuweisungsunterstützung nicht mehr für jedes aufrufbare Objekt mit Typlöschung. Dies erhöht den Durchsatz und reduziert die OBJ-Größe in Programmen, die viele verschiedene Lambdas an std::function übergeben.
  • allocator_traits<std::allocator> enthält manuelle std::allocator-Inlinevorgänge und verringert die Codegröße in Code, der mit std::allocator nur über allocator_traits interagiert (dies gilt für den Großteil von Codes).
  • Die minimale Zuweisungsschnittstelle von C++11 wird jetzt von der Standardbibliothek verarbeitet, die allocator_traits direkt aufruft, anstatt die Zuweisung in einer internen Klasse _Wrap_alloc zu umschließen. Dies reduziert den Umfang des Codes, der für die Unterstützung der Zuweisung generiert wird, verbessert in einigen Fällen die Möglichkeit des Optimierers, sich mit den Standardbibliothekscontainern auseinanderzusetzen, und verbessert das Debuggen (Sie sehen im Debugger jetzt Ihren Zuweisungstyp anstelle von _Wrap_alloc<your_allocator_type>).
  • Die Metaprogrammierung für benutzerdefinierte allocator::reference-Elemente, die von Zuweisungen nicht angepasst werden dürfen, wurde entfernt. (Durch Zuweisungen können Container originelle Zeiger verwenden, aber keine originellen Verweise.)
  • Das Compiler-Front-End entpackt jetzt Debugiteratoren in reihenfolgebasierten for-Schleifen und verbessert so die Leistung von Debugbuilds.
  • Der interne Reduzierungspfad von basic_string für shrink_to_fit() und reserve() befindet sich nicht mehr im Pfad für Neuzuweisungsvorgänge, wodurch der Codeumfang für alle mutierenden Member reduziert wird.
  • Der interne Erweiterungspfad von basic_string befindet sich nicht mehr im Pfad von shrink_to_fit().
  • Mutierende Vorgänge von basic_string werden jetzt in nicht zuweisende schnelle Pfadfunktionen und zuweisende langsame Pfadfunktionen einbezogen, sodass allgemeine, nicht erneut zuweisende Funktionen wahrscheinlicher inline in aufrufende Funktionen eingebettet werden.
  • Mutierende Vorgänge von basic_string konstruieren jetzt erneut zugewiesene Puffer im bevorzugten Zustand, anstatt lokal die Größe zu ändern. Durch eine Einfügung am Anfang einer Zeichenfolge wird der Inhalt nach der Einfügung jetzt z. B. exakt einmal verschoben. Er wird entweder nach unten oder in den neu zugeordneten Puffer verschoben. Folglich wird er bei der Neuzuordnung nicht mehr zweimal verschoben (zunächst in den neu zugeordneten Puffer und dann nach unten).
  • Vorgänge, die die C-Standardbibliothek in <string> aufrufen, speichern jetzt die Adresse von errno, um wiederholte Interaktionen mit TLS zu entfernen.
  • Die Implementierung von is_pointer wurde vereinfacht.
  • Die Änderung des funktionsbasierten Ausdrucks „SFINAE“ in struct- und void_t-basiert wurde abgeschlossen.
  • Algorithmen der Standardbibliothek vermeiden jetzt postinkrementelle Iteratoren.
  • Warnungen zu Abschneidungen beim Verwenden von 32-Bit-Zuweisungen in 64-Bit-Systemen wurden korrigiert.
  • Die Zuweisung von std::vector-Verschiebungen erfolgt jetzt für Vorgänge, die weder der Zuweisung noch POCMA entsprechen, effizienter, indem nach Möglichkeit der Puffer wiederverwendet wird.
Visual Studio 2017 Version 15.5
  • basic_string<char16_t> interagiert nun mit den gleichen Optimierungen von memcmp und memcpy sowie ähnlichen Optimierungen, die von basic_string<wchar_t> verwendet werden.
  • Eine Einschränkung des Optimierers, die verhindert hat, dass Funktionszeiger durch unsere Arbeitsweise „Vermeiden von Kopierfunktionen“ in Visual Studio 2015 Update 3 inline dargestellt wurden, wurde umgangen, wodurch die Leistung von lower_bound(iter, iter, function pointer) wiederhergestellt wurde.
  • Der Mehraufwand für die Überprüfung der Reihenfolge von Eingaben (includes, set_difference, set_symmetric_difference und set_union) des Iteratordebuggens wurde durch das Entpacken von Iteratoren vor der Überprüfung der Reihenfolge verringert.
  • std::inplace_merge überspringt nun Elemente, die sich bereits in der richtigen Position befinden.
  • Das Erstellen von std::random_device erstellt nicht länger ein std::string-Element bzw. zerstört es auch nicht mehr.
  • Für std::equal und std::partition wurde ein Jump Threading-Optimierungsdurchlauf ausgeführt, durch den ein Iteratorvergleich weniger erforderlich ist.
  • Wenn std::reverse Zeiger auf trivial kopierbares T übergeben werden, erfolgt die Ausgabe nun an eine handgeschriebene vektorisierte Implementierung.
  • std::fill, std::equal und std::lexicographical_compare wurden beigebracht, wie die Weiterleitung an memset und memcmp für std::byte und gsl::byte (sowie für andere char-ähnliche Enumerationen und Enumerationsklassen) funktioniert. Die Weiterleitung für std::copy erfolgt mithilfe von is_trivially_copyable. Daher sind keine Änderungen notwendig.
  • Die Standardbibliothek enthält keine Destruktoren mehr mit leeren Klammern, deren einziges Verhalten darin bestand, Typen als nicht tribial zerstörbar zu definieren.

Weitere Bibliotheken

Unterstützung für Open-Source-Bibliotheken

Vcpkg ist ein Open-Source-Befehlszeilentool, das den Prozess des Beziehens und Erstellens von statischen C++-Open-Source Bibliotheken und DLLs in Visual Studio sehr stark vereinfacht. Weitere Informationen finden Sie unter vcpkg.

C++ REST SDK 2.9.0

Visual Studio 2017 Version 15.5

CPPRestSDK, eine plattformübergreifende Web-API für C++, wurde auf Version 2.9.0 aktualisiert. Weitere Informationen finden Sie im Blogbeitrag CppRestSDK 2.9.0 is available on GitHub.

ATL

Visual Studio 2017 Version 15.5
  • Weitere Korrekturen an der Übereinstimmung bei der Suche nach Namen
  • Vorhandene Bewegungskonstruktoren und Bewegungszuweisungsoperatoren werden jetzt ordnungsgemäß als nicht auslösend markiert.
  • Die gültige Warnung C4640 zur threadsicheren Initialisierung von lokalen statischen Variablen in „atlstr.h“ wird nicht mehr unterdrückt.
  • Die threadsichere Initialisierung lokaler statischer Variablen wurde bei Verwendung von ATL zum Erstellen einer DLL im XP-Toolset automatisch deaktiviert. Dies ist nicht mehr der Fall. Wenn Sie keine threadsichere Initialisierung wünschen, können Sie /Zc:threadSafeInit- in Ihren Projekteinstellungen hinzufügen.

Visual C++ Runtime

  • Neuer Header „cfguard.h“ für Ablaufsteuerungsschutz-Symbole.

Visual Studio 2017 C++-IDE

  • Die Leistung bei Konfigurationsänderungen ist jetzt für native C++-Projekte besser und für C++-/CLI-Projekte viel besser. Wenn eine Projektmappenkonfiguration zum ersten Mal aktiviert wird, ist sie jetzt schneller, und alle späteren Aktivierungen dieser Projektmappenkonfiguration erfolgen fast unmittelbar.
Visual Studio 2017 Version 15.3
  • Verschiedene Projekt- und Code-Assistenten wurden im Signaturdialogstil umgeschrieben.
  • Klasse hinzufügen startet den Assistenten zum Hinzufügen von Klassen nun direkt. Alle anderen Elemente, die hier zuvor verfügbar waren, finden Sie nun unter Hinzufügen > Neues Element.
  • Win32-Projekte sind nun im Dialogfeld Neues Projekt in der Windows Desktop-Kategorie zu finden.
  • Die Windows-Konsolen- und Desktopanwendungsvorlagen erstellen die Projekte nun, ohne einen Assistenten anzuzeigen. Es gibt einen neuen Windows Desktop-Assistenten in der gleichen Kategorie, der die gleichen Optionen wie der alte Assistent für die Win32-Konsolenanwendung anzeigt.
Visual Studio 2017 Version 15.5

Mehrere Vorgänge in C++, die die IntelliSense-Engine für Refactoring und Codenavigation verwenden, werden viel schneller ausgeführt. Die folgenden Angaben basieren auf der Visual Studio Chromium-Lösung mit 3.500 Projekten:

Feature Leistungssteigerung
Umbenennen 5,3-fach
Signatur ändern 4,5-fach
Alle Verweise suchen 4,7-fach

C++ unterstützt jetzt STRG+Klick-GoTo-Definition, was die Navigation mit der Maus zu Definitionen vereinfacht. Die Strukturvisualisierung aus dem Productivity Power Tools-Paket ist nun standardmäßig auch im Produkt enthalten.

IntelliSense

  • Die neue, auf SQLite basierende Datenbank-Engine wird jetzt standardmäßig verwendet. Mit der neuen Engine werden Datenbankvorgänge wie Zur Definition wechseln und Alle Verweise suchen beschleunigt. Die Dauer der anfänglichen Projektmappenanalyse wird erheblich reduziert. Diese Einstellung befindet sich jetzt unter Extras > Optionen > Text-Editor > C/C++ > Erweitert. (Bisher befand sie sich unter ...C/C++ > Experimentell.)

  • Wir haben die IntelliSense-Leistung für Projekte und Dateien verbessert, die keine vorkompilierten Header verwenden. Ein automatisch vorkompilierter Header wird für Header in der aktuellen Datei erstellt.

  • Wir haben die Fehlerfilterung und Hilfe für IntelliSense-Fehler in der Fehlerliste hinzugefügt. Das Klicken auf die Fehlerspalte ermöglicht jetzt die Filterung. Durch Klicken auf die einzelnen Fehler oder durch Drücken von F1 wird eine Onlinesuche nach der Fehlermeldung gestartet.

    Fehlerliste.

    Fehlerliste gefiltert.

  • Die Möglichkeit zum Filtern von Elementen der Memberliste nach Typ wurde hinzugefügt.

    Filterung der Memberliste.

  • Eine neue experimentelle, vorhersehbare IntelliSense-Funktion, die das kontextbewusste Filtern in der Memberliste bereitstellt, wurde hinzugefügt. Weitere Informationen finden Sie im Blogbeitrag C++ IntelliSense Improvements – Predictive IntelliSense & Filtering (Verbesserungen in C++-IntelliSense: Predictive IntelliSense und Filtern).

  • Alle Verweise suchen (UMSCHALT+F12) ermöglicht nun eine einfachere Navigation, auch in komplexen Codebasen. Das Feature bietet eine erweiterte Gruppierung, Filterung, Sortierung, Suche in Ergebnissen und (für einige Sprachen) eine Einfärbung, damit Sie Ihre Verweise umfassend verstehen können. Für C++ enthält die neue Benutzeroberfläche Informationen dazu, ob Informationen aus einer Variablen gelesen oder in eine Variable geschrieben werden.

  • Das Punkt-zu-Pfeil-Feature von IntelliSense wurde von „Experimentell“ in „Erweitert“ verschoben und ist nun standardmäßig aktiviert. Die Editor-Features Erweiterungsbereiche und Erweiterungsrangfolge wurden auch von „Experimentell“ in „Erweitert“ verschoben.

  • Die experimentellen Refactoringfeatures Signatur ändern und Funktion extrahieren sind nun standardmäßig verfügbar.

  • Das neue experimentelle Feature „Schnelleres Laden von Projekten“ für C++-Projekte wurde hinzugefügt. Wenn Sie das nächste Mal ein C++-Projekt öffnen, wird es schneller geladen. Anschließende Ladevorgänge erfolgen sogar noch schneller!

  • Einige dieser Features sind auch in anderen Sprachen gängig, während einige C++-spezifisch sind. Weitere Informationen zu diesen neuen Features finden Sie im Blogbeitrag Announcing Visual Studio "15" Preview 5 (Ankündigung von Visual Studio 2017 Vorschauversion 5).

Visual Studio 2017-Version 15.7

Nicht-MSBuild-Projekte mit „Ordner öffnen“

In Visual Studio 2017 wurde das Feature Ordner öffnen eingeführt. Dieses Feature ermöglicht Ihnen das Programmieren, Erstellen von Builds und Debuggen in einem Ordner mit Quellcode, ohne dass Projektmappen oder Projekte erstellt werden müssen. Dadurch wird der Einstieg in Visual Studio wesentlich einfacher, selbst wenn Ihr Projekt nicht auf MSBuild basiert. Über Ordner öffnen erhalten Sie Zugriff auf leistungsstarke Funktionen zum Bearbeiten, Erstellen und Debuggen von Code. Diese Funktionen entsprechen den Funktionen, die in Visual Studio bereits für MSBuild-Projekte verfügbar sind. Weitere Informationen finden Sie unter Open Folder projects for C++ (Verwenden von „Ordner öffnen“ mit Projekten in Visual C++).

  • Verbesserungen in der Benutzeroberfläche „Ordner öffnen“. Sie können die Oberfläche über diese JSON-Dateien anpassen:
    • CppProperties.json zum Anpassen des IntelliSense- und Browsererlebnisses.
    • Tasks.json zum Anpassen der Buildschritte.
    • Launch.json zum Anpassen des Debugvorgangs.
Visual Studio 2017 Version 15.3
  • Die Unterstützung für alternative Compiler und Buildumgebungen wie MinGW und Cygwin wurde verbessert. Weitere Informationen finden Sie unter Using MinGW and Cygwin with Visual C++ and Open Folder (Verwenden von MinGW und Cygwin mit Visual C++ und „Ordner öffnen“).
  • Unterstützung für das Definieren von globalen und konfigurationsspezifischen Umgebungsvariablen in „CppProperties.json“ und „CMakeSettings.json“ wurde hinzugefügt. Diese Umgebungsvariablen können von in „launch.vs.json“ definierten Debugkonfigurationen und von Aufgaben in „tasks.vs.json“ verwendet werden. Weitere Informationen finden Sie unter Anpassen Ihrer Umgebung mit Visual C++ und „Ordner öffnen“.
  • Unterstützung für den Ninja-Generator von CMake wurde verbessert, einschließlich der Möglichkeit, ganz einfach 64-Bit-Plattformen als Ziel zu verwenden.

Unterstützung von CMake über „Ordner öffnen“

Visual Studio 2017 führt die Unterstützung für die Verwendung von CMake-Projekten ohne Konvertierung in MSBuild-Projektdateien (.vcxproj) ein. Weitere Informationen finden Sie unter CMake-Projekte in Visual Studio. Durch Öffnen von CMake-Projekten mit Ordner öffnen wird die Umgebung für die Bearbeitung, Erstellung und das Debuggen von C++ automatisch konfiguriert.

  • C++-IntelliSense funktioniert, ohne dass Sie eine „CppProperties.json“-Datei im Stammordner erstellen müssen. Es wurde ein neues Dropdownmenü hinzugefügt, sodass Benutzer*innen einfach zwischen von CMake- und CppProperties.json-Dateien bereitgestellten Konfigurationen wechseln können.

  • Weitere Konfigurationen werden über eine Datei „CMakeSettings.json“ unterstützt, die sich im gleichen Ordner wie die Datei „CMakeLists.txt“ befindet.

    CMake – Ordner öffnen.

Visual Studio 2017 Version 15.3
  • Unterstützung für den Ninja-Generator von CMake wurde hinzugefügt.
Visual Studio 2017 Version 15.4
  • Unterstützung für das Importieren von vorhandenen CMake-Caches wurde hinzugefügt.
Visual Studio 2017 Version 15.5

Windows-Desktopentwicklung

Die Installationsoberfläche ermöglicht bei der Installation der ursprünglichen C++-Arbeitsauslastung jetzt eine feinere Abstimmung. Es wurden auswählbare Komponenten hinzugefügt, sodass Sie nur die Tools installieren können, die Sie benötigen. Die angegebenen Installationsgrößen für die im Installationsprogramm aufgeführten Komponenten sind falsch, sodass die Gesamtgröße unterschätzt wird.

Wenn Sie Win32-Projekte erfolgreich in der C++-Desktoparbeitsauslastung erstellen möchten, müssen Sie ein Toolset und ein Windows SDK installieren. Zum Installieren der empfohlenen (ausgewählten) Komponenten benötigen Sie VC++ 2017 c141 Toolset (x86, x64) und Windows 10 SDK (10.0.nnnnn) . Sollten die erforderlichen Tools nicht installiert sein, werden Projekte nicht erfolgreich erstellt. Außerdem reagiert der Assistent nicht mehr.

Visual Studio 2017 Version 15.5

Die Visual C++ Build-Tools (zuvor als eigenständiges Produkt verfügbar) sind jetzt als Workload im Visual Studio-Installer enthalten. Diese Workload installiert nur die Tools, die zum Erstellen von C++-Projekten ohne Installation der Visual Studio-IDE erforderlich sind. Die Toolsets v140 und v141 sind beide enthalten. Das v141-Toolset enthält die neuesten Verbesserungen in Version 15.5 von Visual Studio 2017. Weitere Informationen finden Sie unter Visual Studio Build Tools enthalten nun die MSVC-Toolsets VS2017 und VS2015.

Linux-Entwicklung mit C++

Die beliebte Erweiterung Visual C++ für Linux-Entwicklung ist nun Bestandteil von Visual Studio. Diese Installation bietet alles, was Sie zum Entwickeln und Debuggen von C++-Anwendungen in einer Linux-Umgebung benötigen.

Visual Studio 2017 Version 15.2

Verbesserungen für plattformübergreifende gemeinsame Codenutzung und Typvisualisierung wurden vorgenommen. Weitere Informationen finden Sie unter Linux C++ improvements for cross-platform code sharing and type visualization (Linux C++ – Verbesserungen für plattformübergreifende gemeinsame Codenutzung und Typvisualisierung).

Visual Studio 2017 Version 15.5
  • Der Linux-Workload wurde Unterstützung für rsync als Alternative zu sftp hinzugefügt, um Dateien auf Linux-Remotecomputern zu synchronisieren.
  • Unterstützung für Kreuzkompilierung für ARM-Mikrocontroller wurde hinzugefügt. Um dies in der Installation zu aktivieren, wählen Sie Linux-Entwicklung mit der C++-Workload und dann die Option für Eingebettete und IoT-Entwicklung aus. Durch diese Option werden die ARM GCC-Kreuzkompilierungstools und Make Ihrer Installation hinzugefügt. Weitere Informationen finden Sie unter ARM GCC-Kreuzkompilierung in Visual Studio.
  • Unterstützung für CMake wurde hinzugefügt. Sie können nun an Ihrer bestehenden CMake-Codebasis arbeiten, ohne sie in ein Visual Studio-Projekt konvertieren zu müssen. Weitere Informationen finden Sie unter Konfigurieren eines Linux CMake-Projekts.
  • Unterstützung für das Ausführen von Remotetasks wurde hinzugefügt. Mit dieser Funktion können Sie jeden Befehl auf einem Remotesystem ausführen, das im Verbindungs-Manager von Visual Studio definiert ist. Remotetasks bieten auch die Möglichkeit zum Kopieren von Dateien auf das Remotesystem. Weitere Informationen finden Sie unter Konfigurieren eines Linux CMake-Projekts.
Visual Studio 2017-Version 15.7

Spieleentwicklung mit C++

Verwenden Sie die volle Leistung von C++, um professionelle Spiele zu erstellen, die von DirectX oder Cocos2d unterstützt werden.

Mobile Entwicklung mit C++ für Android und iOS

Sie können nun mithilfe von Visual Studio mobile Apps erstellen und debuggen, die auf Android und iOS ausgerichtet sind.

Universelle Windows-Apps

C++ wird als optionale Komponente für die Arbeitsauslastung der Universellen Windows-App bereitgestellt. Aktuell müssen C++-Projekte manuell aktualisieren werden. Sie können ein Projekt für die Universelle Windows-Plattform mit dem Ziel v140 in Visual Studio 2017 öffnen. Wenn Visual Studio 2015 nicht installiert ist, müssen Sie das v141-Plattformtoolset jedoch auf den Projekteigenschaftenseiten auswählen.

Neue Optionen für C++ auf der universellen Windows-Plattform (UWP)

Ihnen stehen nun neue Optionen zum Schreiben und Packen von C++-Anwendungen für die Universelle Windows-Plattform und den Microsoft Store zur Verfügung: Mit der Desktop Bridge-Infrastruktur können Sie Ihre vorhandene Desktopanwendung oder das COM-Objekt für die Bereitstellung über den Microsoft Store packen. Oder für die Bereitstellung über Ihre vorhandenen Kanäle mittels Querladen. Mit den neuen Funktionen in Windows 10 können Sie Ihre Desktopanwendung auf unterschiedliche Weise um die Funktionalität der universellen Windows-Plattform (UWP) erweitern. Weitere Informationen finden Sie unter Desktop Bridge.

Visual Studio 2017 Version 15.5

Eine Projektvorlage Paketerstellungsprojekt für Windows-Anwendungen wurde hinzugefügt, die die Paketerstellung von Desktopanwendungen mithilfe von Desktop Bridge unterstützt. Sie ist unter Datei > Neu > Projekt > Installiert > Visual C++ > Universelle Windows-Plattform verfügbar. Weitere Informationen finden Sie unter Packen einer App mit Visual Studio (Desktop Bridge).

Beim Schreiben von neuem Code können Sie nun C++/WinRT verwenden. Dies ist eine C++-Standardsprachprojektion für Windows-Runtime (WinRT), die nur in Headerdateien implementiert wird. Mit ihr können Sie Windows-Runtime-APIs mit jedem standardkonformen C++-Compiler nutzen und erstellen. C++/WinRT wurde dafür konzipiert, C++-Entwicklern erstklassigen Zugriff auf die moderne Windows-API zur Verfügung zu stellen. Weitere Informationen finden Sie unter C++/WinRT.

Ab Build 17025 der Windows SDK Insider Preview ist C++/WinRT im Windows SDK enthalten. Weitere Informationen finden Sie unter C++/WinRT ist jetzt im Windows SDK enthalten.

Das Clang/C2-Plattformtoolset

Das Clang/C2-Toolset, das im Lieferumfang von Visual Studio 2017 enthalten ist, unterstützt jetzt die Option /bigobj , die für das Erstellen großer Projekte entscheidend ist. Es umfasst außerdem eine Reihe wichtiger Fehlerbehebungen, sowohl im Front-End als auch im Back-End des Compilers.

C++-Codeanalyse

Visual Studio liefert nun die C++-Kernprüfungen zum Erzwingen der C++-Kernrichtlinien. Aktivieren Sie die Prüfungen auf den Projekteigenschaftenseiten in den Erweiterungen für die Codeanalyse. Die Erweiterungen werden dann beim Ausführen der Codeanalyse eingeschlossen. Weitere Informationen finden Sie unter Verwenden der C++-Core-Richtlinienprüfungen.

Screenshot des Dialogfelds „Eigenschaftenseiten“, in dem „Konfigurationseigenschaften“ > Codeanalyse > „Allgemein“ ausgewählt ist und im Abschnitt „Diesen Regelsatz ausführen“ eine Reihe von Core-Prüfungen aufgeführt werden.

Visual Studio 2017 Version 15.3
  • Es wurde Unterstützung für Regeln in Bezug auf die Ressourcenverwaltung hinzugefügt.
Visual Studio 2017 Version 15.5
  • Neue C++ Core Guidelines überprüfen intelligente Zeiger auf Richtigkeit, prüfen die richtige Verwendung globaler Initialisierer und kennzeichnen die Verwendungen von Konstrukten wie goto sowie fehlerhafte Typumwandlungen.

  • Einige Warnnummern, die in Version 15.3 vorhanden waren, sind in Version 15.5 nicht mehr verfügbar. Diese Warnungen wurden durch genauere Überprüfungen ersetzt.

Visual Studio 2017 Version 15.6
Visual Studio 2017-Version 15.7

Komponententests in Visual Studio 2017

Visual Studio 2017 Version 15.5

Google Test Adapter und Boost.Test-Adapter sind jetzt als Komponenten der Workload Desktopentwicklung mit C++ verfügbar. Sie sind in den Test-Explorer integriert. CTest-Unterstützung wurde für CMake-Projekte hinzugefügt (unter Verwendung von „Ordner öffnen“), obwohl die vollständige Integration in den Test-Explorer noch nicht verfügbar ist. Weitere Informationen finden unter Erstellen von Komponententests für C/C++.

Visual Studio 2017 Version 15.6
  • Unterstützung für dynamische Boost.Test-Bibliotheksunterstützung hinzugefügt.
  • In der IDE steht jetzt eine Boost.Test-Elementvorlage zur Verfügung.

Weitere Informationen finden Sie unter Boost.Test Unit Testing: Dynamic Library support and New Item Template (Komponententests mit Boost.Test: Unterstützung für dynamische Bibliotheken und neue Elementvorlagen).

Visual Studio 2017-Version 15.7

Unterstützung für CodeLens für C++-Komponententestprojekte hinzugefügt. Weitere Informationen finden Sie unter Announcing CodeLens for C++ Unit Testing (Ankündigung: CodeLens für C++-Unittests).

Visual Studio-Grafikdiagnose

Visual Studio-Grafikdiagnosetools: Mit diesen Tools können Sie Rendering- und Leistungsprobleme bei Direct3D-Apps erfassen und analysieren. Verwenden Sie sie für Apps, die lokal auf Ihrem Windows-PC, in einem Windows-Geräteemulator oder auf einem Remotecomputer oder -gerät ausgeführt werden.

  • Eingabe und Ausgabe von Vertex- und Geometrieshadern: Die Möglichkeit der Anzeige der Ein- und Ausgabe von Vertex- und Geometrieshadern war eines der am häufigsten gewünschten Features. Dieses Feature wird nun in den Tools unterstützt. Wählen Sie die VS- oder GS-Phase in der Ansicht „Pipelinestufen“, um mit dem Untersuchen der Ein- und Ausgabe in der nachstehenden Tabelle zu beginnen.

    Ein-/Ausgabe für Shader.

  • Suchen und Filtern in der Objekttabelle: Diese Option stellt eine schnelle und einfache Möglichkeit dar, die gesuchten Ressourcen zu finden.

    Screenshot des Abschnitts „Objekttabelle“, in dem das Dropdown „Typ“ und das Suchfeld gekennzeichnet sind.

  • Ressourcenverlauf: In dieser neue Ansicht wurde der gesamte Änderungsverlaufs einer Ressource und deren Verwendung während des Renderns eines aufgezeichneten Frames optimiert. Um den Verlauf für jede Ressource aufzurufen, klicken Sie auf das Uhrsymbol neben jeden Ressourcenlink.

    Ressourcenverlauf.

    Dadurch wird das Toolfenster Ressourcenverlauf angezeigt, in dem sich der Änderungsverlauf der Ressource befindet.

    Ressourcenverlaufsänderung.

    Sie können Frames bei aktivierter Erfassung der vollständigen Aufrufliste erfassen. Dadurch können Sie im Handumdrehen den Kontext der einzelnen Änderungsereignisse ableiten und innerhalb Ihres Visual Studio-Projekts untersuchen. Die Option zur Erfassung der vollständigen Liste wird in Visual Studio im Dialogfeld Tools > Optionen unter Grafikdiagnose festgelegt.

  • API-Statistiken: Eine allgemeine Zusammenfassung der API-Verwendung in Ihrem Frame. Dies kann beim Ermitteln von Aufrufen nützlich sein, von denen Sie nicht wissen, dass sie erfolgen, oder von Aufrufen, die zu häufig erfolgen. Dieses Fenster steht über Ansicht > API-Statistiken in der Visual Studio-Grafikanalyse zur Verfügung.

    API-Statistiken.

  • Speicherstatistiken: Diese Option stellt dar, wie viel Arbeitsspeicher der Treiber für die Ressourcen reserviert, die Sie im Frame erstellen. Dieses Fenster steht über Ansicht > Speicherstatistiken in der Visual Studio-Grafikanalyse zur Verfügung. Um Daten zur Anzeige in einer Tabellenkalkulation in eine CSV-Datei zu kopieren, klicken Sie mit der rechten Maustaste, und wählen Sie Alles kopieren.

    Speicherstatistiken.

  • Frame-Überprüfung: Mit dieser neuen Liste mit Fehlern und Warnungen können Sie je nach Problem, das auf Direct3D-Debugebene erkannt wurde, einfach zu Ihrer Ereignisliste navigieren. Klicken Sie zum Öffnen des Fensters in der Visual Studio-Grafikanalyse auf Ansicht > Frame-Überprüfung. Klicken Sie dann auf Überprüfung ausführen, um die Analyse zu starten. Je nach Komplexität des Frames kann dieser Vorgang mehrere Minuten dauern.

    Frame-Validierung.

  • Frame-Analyse für D3D12: Verwenden Sie die Frame-Analyse zum Analysieren der Leistung von Zeichenvorgängen mit „Was-wäre-wenn“-Experimenten. Wechseln Sie zur Registerkarte „Frame-Analyse“, und führen Sie Analysen aus, um den Bericht anzuzeigen.

    Frame-Analyse.

  • Verbesserungen der GPU-Auslastung: Offene Ablaufverfolgungen können über den Visual Studio-Profiler für GPU-Auslastung mit dem Tool „GPU-Ansicht“ oder Windows Performance Analyzer (WPA) abgerufen werden, um eine detailliertere Analyse durchzuführen. Wenn das Windows Performance Toolkit installiert ist, sind rechts unten in der Sitzungsübersicht zwei Links vorhanden: einer für WPA und einer für die GPU-Ansicht.

    GPU-Nutzung.

    Ablaufverfolgungen, die über diesen Link in der GPU-Ansicht geöffnet werden, unterstützen das synchronisierte Zoomen und Schwenken auf der Zeitachse in Visual Studio und der GPU-Ansicht. Über ein Kontrollkästchen in Visual Studio wird festgelegt, ob die Synchronisierung aktiviert ist oder nicht.

    GPUView.