Freigeben über


Funktionen C++11 modernes (C++)

In diesem Dokument werden die Features des neuen C++-Standards-auch, der als C++11-that bezeichnet wird, werden implementiert in Visual C++.

Sprachfunktionen des Kern-C++11

Visual C++ 2010 implementierte viele Funktionen in der C++0x-Kern-Sprachenspezifikation, der der Vorläufer zu C++11 war, und Visual C++ in Visual Studio 2012 wird auf dem, um viele Funktionen C++11 einzuschließen.Die folgenden Kernsprachfunktionen der Tabelle C++11 und deren Stand der Umsetzung in Visual C++ 2010 und in Visual C++ in Visual Studio 2012.

Sprachfunktionen des Kern-C++11

VC10

VC11

Rvalue-Verweise v0.1v1.0v2.0v2.1, Framework

v2.0

v2.1*

REFQualifizierer

Nein

Nein

Nicht statische Datenmemberinitialisierer

Nein

Nein

Variadic-Vorlagen v0.9, v1.0

Nein

Nein

Initialisierungslisten

Nein

Nein

static_assert

Ja

Ja

Automatisch v0.9, v1.0

v1.0

v1.0

Nachfolgende Rückgabetypen

Ja

Ja

Bei Lambdas v0.9v1.0, v1.1

v1.0

v1.1

decltype v1.0, v1.1

v1.0

v1.1**

Rechte spitze Klammern

Ja

Ja

Standardvorlagenargumente für Funktionsvorlagen

Nein

Nein

Ausdruck SFINAE

Nein

Nein

Aliasvorlagen

Nein

Nein

Extern-Vorlagen

Ja

Ja

Nullptr-Schlüsselwort

Ja

Ja

Stark typisierte Enumerationen

Partial

Ja

Vorwärts deklarierte Enumerationen

Nein

Ja

Attribute

Nein

Nein

constexpr

Nein

Nein

Ausrichtung

TR1

Partial

Delegieren von Konstruktoren

Nein

Nein

Vererben von Konstruktoren

Nein

Nein

Operatoren der expliziten Konvertierung

Nein

Nein

char16_t

Nein

Nein

Unicode-Zeichenfolgen-Literale

Nein

Nein

Nicht formatierte Zeichenfolgenliterale

Nein

Nein

universalen Zeichennamen in den Literalen

Nein

Nein

Benutzerdefinierte Literale

Nein

Nein

Standard-Layout und einfache Typen

Nein

Ja

Der Standardwert angenommene und gelöschte Funktionen

Nein

Nein

Erweiterte Friend-Deklarationen

Ja

Ja

Erweitert

Nein

Nein

inline Namespaces

Nein

Nein

Uneingeschränkte Unions

Nein

Nein

Lokale und unbenannte Typen als Vorlagenargumente

Ja

Ja

Bereichsbasierte For-Schleife

Nein

Ja

Überschreibung endgültig v0.8v0.9, und v1.0

Partial

Ja

Minimale GC-Unterstützung

Ja

Ja

noexcept

Nein

Nein

Sprachfunktionen des Kern-C++11: Parallelität

VC10

VC11

Anders formulierte Sequenzpunkte

Nicht zutreffend

Nicht zutreffend

Atomphysik

Nein

Ja

Stark vergleichen Sie und tauschen Sie aus

Nein

Ja

Bidirektionale Zäune

Nein

Ja

Arbeitsspeichermodell

Nicht zutreffend

Nicht zutreffend

Daten-Abhängigkeitsreihenfolge

Nein

Ja

Daten-Abhängigkeitsreihenfolge: Funktionsanmerkung

Nein

Nein

exception_ptr

Ja

Ja

quick_exit

Nein

Nein

Atomphysik in den Signalhandlern

Nein

Nein

Lokaler Threadspeicher

Partial

Partial

Magic Statik

Nein

Nein

Sprachfunktionen des Kern-C++11: C99

VC10

VC11

__func

Partial

Partial

Präprozessor C99

Partial

Partial

lang lang

Ja

Ja

Erweiterte Integer-Typen

Nicht zutreffend

Nicht zutreffend

Hier ist eine Kurzanleitung zu den Informationen in den Tabellen.

Hh567368.collapse_all(de-de,VS.110).gifRvalue-Verweise

N1610 "Erklärung der Initialisierung der Klassenobjekte über Rvalue" war zuvor ein Versuch, Verschiebesemantik ohne rvalue-Verweise zu aktivieren.Um dieser Diskussion willen müssen wir sie aufrufen "rvalue-Verweise v0.1." Sie wurde durch ersetzt "rvalue-Verweise v1.0." Auf Grundlage "rvalue-Verweise v2.0", die ist, was die Arbeit in Visual C++ 2010 war, verhindert rvalue-Verweise für die Bindung an den lvalues und ein eine Sicherheitsproblem insofern von korrigieren. "Rvalue-Verweise v2.1"entwickelt diese Regel weiter.Betrachten Sie vector<string>::push_back(), das die Überladungen push_back(const string&) und push_back(string&&) hat, und den Aufruf v.push_back("strval").Der Ausdruck "strval" ist ein Zeichenfolgenliteral, und es ist ein L-Wert.(Andere Literale, beispielsweise ganzzahlige 1729, sind Rvalue, aber Zeichenfolgenliterale sind speziell, da sie Arrays sind.) Die Regeln der rvalue-Verweise v2.0 sagten, kann string&& nicht zu "strval" binden, da "strval" ein L-Wert ist und daher, push_back(const string&) geeignete die einzige Überladung ist.Dies würde temporäres std::string erstellen, es in den Vektor kopiert und anschließend zerstört temporäre std::string.Dies war nicht sehr effizient.Die Regeln der rvalue-Verweise v2.1 erkennen, dass, string&& zu "strval" an, std::string temporäres erstellen würde und dass ein Rvalue temporär ist.Daher sind push_back(const string&) und push_back(string&&) lebensfähig, und push_back(string&&) wird bevorzugt.Temporäres std::string verschoben wird erstellt und dann in den Vektor.Dies ist effizienter.

"Rvalue-Verweise Framework" fügt neue Regeln hinzu, Verschiebungskonstruktoren automatisch generieren und Zuweisungsoperatoren unter bestimmten Bedingungen zu setzen.ist jedoch nicht in Visual C++ in Visual Studio 2012, aufgrund der Zeitraum und Ressourceneinschränkungen implementiert.

WarnhinweisVorsicht

Die v0.1, v1.0, v2.0, v2.1, Bezeichnungen v3.0 werden aus Gründen der Übersichtlichkeit und die Entwicklung von C++11 frei erfunden. anzuzeigen.

Hh567368.collapse_all(de-de,VS.110).gifLambdas

Nachdem Lambda-Funktionen in das Arbeitspapier (Version 0.9) gewählt wurden und änderbare Lambdas wurden (Version 1.0) hinzugefügt, überholte der Standardisierungs-Ausschuss die Benennung.Dies generierte Lambdas Version 1.1.Dies tritt zu spät auf, in Visual C++ 2010 integriert werden, es ist jedoch in Visual C++ in Visual Studio 2012.Die Lambdas v1.1 Benennung erläutert, was in Eckfällen auftreten sollte wie statische Member oder geschachtelte Lambdas verweisen.Dieses Fehler behebt, die von komplexen Lambdas gestartet werden.Darüber hinaus sind in Visual C++ in Visual Studio 2012, zustandslose Lambdas zu den Funktionszeigern konvertiert werden.Dies ist nicht in der Benennung N2927, jedoch wird als Teil der Lambdas v1.1 alle gezählt.FDIS 5.1.2 [expr.prim.lambda]/6 hat diese Beschreibung: "Der Abschlusstyp für einen Lambda-Ausdruck ohne LambdaErfassung verfügt über eine öffentliche nicht virtuelle NichtEXPLICIT-const Konvertierungsfunktion in Zeiger, zu arbeiten, denselben Parametern und Rückgabetypen wie der des Abschlussfunktionsaufrufoperator Typs aufweisen.Der Wert, der von dieser Konvertierungsfunktion zurückgegeben wird, ist die Adresse einer Funktion, die, wenn Sie aufgerufen werden, die gleichen Auswirkungen wie für, den Abschlussfunktionsaufrufoperator des Typs werden." ( Visual C++ in Visual Studio 2012 ist sogar besser als das daran, dass zustandslose Lambdas konvertierbar zu den Funktionszeigern vorgenommen haben, die beliebige Aufrufkonventionen haben.Dies ist wichtig, wenn Sie APIs verwenden, das Elemente wie __stdcall-Funktionszeiger) erwarten.

Hh567368.collapse_all(de-de,VS.110).gifdecltype

Nachdem decltype in das Arbeitspapier (Version 1.0) gewählt wurde, hat es eine kleine jedoch wichtige Fehlerkorrektur in letzten Minute (Version 1.1).Dies ist vom großen Interesse für den Programmierer, die an STL und dem Auftrieb arbeiten.

Hh567368.collapse_all(de-de,VS.110).gifStark typisierte/leiten Sie deklarierte Enumerationen weiter

Stark typisierte Enumerationen wurden teilweise in Visual C++ 2010 unterstützt (speziell, der Teil über explizit angegebene zugrunde liegende Typen).Visual C++ in Visual Studio 2012 implementiert sie vollständig und auch vollständig implementiert die Semantik C++11 für leiten Sie deklarierte Enumerationen weiter.

Hh567368.collapse_all(de-de,VS.110).gifAusrichtung

Weder noch Visual C++ 2010Visual C++ in Visual Studio 2012 implementieren die Kern-Schlüsselworte alignas/alignof von, Ausrichtungsantrag das in das Arbeitspapier gewählt wurde.Visual C++ 2010 hatte aligned_storage von TR1.Visual C++ in Visual Studio 2012 fügt aligned_union und std::align() der Standardbibliothek hinzu.

Hh567368.collapse_all(de-de,VS.110).gifStandard-Layout und einfache Typen

Die verfügbar gemachten Änderungen von "HÜLSE N2342 erneut überprüft; Auflösen von Kernfrage Revision 568 (5)" sind Ergänzungen von is_trivial und von is_standard_layout zu <type_traits>.(N2342 überarbeitete viel Kern-Sprachenbenennung, aber keine Compileränderungen sind erforderlich.) Diese Typmerkmale waren in Visual C++ 2010 verfügbar, jedoch nur is_pod doppelten.Daher wird die Tabelle bereits in diesem Dokument "no" Unterstützung.In Visual C++ in Visual Studio 2012 werden sie durch Compilerhooks betrieben, die entwickelt wurden, um genaue Antworten zu geben.

Hh567368.collapse_all(de-de,VS.110).gifÜberschreibung und endgültige

Dieses lief eine kurze jedoch schwierig Entwicklung durch.Ursprünglich in Version 0.8 gab es override[[]], [hiding[]] und [[]]base_check-Attribute.Anschließend in Version 0.9, wurden die Attribute von kontextbedingte Schlüsselwörter entfernt und ersetzt.Schließlich in Version 1.0 wurden sie "zu final" auf Klassen und "zu override" und "zu final" auf Funktionen reduziert.Dadurch kann eine aufgestiegene Erweiterung, da diese bereits Visual C++ 2010 "override" Syntax auf unterstützte Funktionen, und hatte Semantik angemessen eng an die in C++11. "final" wurde auch unterstützt, jedoch mit unterschiedlichen Schreibweise "versiegelte".In Visual Studio 2012 wird die Standardrechtschreibung und die Semantik "von override" und "von"final vollständig unterstützt.Weitere Informationen finden Sie unter override-Bezeichner und final-Bezeichner.

Hh567368.collapse_all(de-de,VS.110).gifAtomphysik und mehr

Atomphysikstark vergleichen Sie und tauschen Sie aus, bidirektionale Zäune und Datenabhängigkeitsreihenfolge geben Sie Standardbibliotheksmaschinerie an, die in Visual C++ in Visual Studio 2012 implementiert werden.

Hh567368.collapse_all(de-de,VS.110).gifStandardbibliotheks-Funktionen

Dies umfasst die Kern-Sprache.Was die Standardbibliothek beschreibt C++11, es existiert keine hübsche Tabelle von Funktionen, aber Visual C++ in Visual Studio 2012 implementiert sie, mit zwei Ausnahmen.Zuerst wenn einer Bibliotheksfunktion der Funktionen abhängig ist, die im Compiler fehlt, wird entweder simulieren, was benötigen – z. B. wir variadic Vorlagen für make_shared<T>() simuliert - oder wir implementieren es-dort nicht sind nur einige Fälle insbesondere die <initializer_list>.Zweitens ist die Standardbibliothek C99, die durch Verweis in die Standardbibliothek C++11 integriert ist, meist unimplementiert, obwohl <stdint.h> in Visual C++ 2010 implementiert wurde.Hier ist eine partielle Liste der Änderungen in Visual C++ in Visual Studio 2012:

Neue Header:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator> und <thread>.

machen: wie von C++11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() gefordert werden in allen Containern für "die beliebigen" Anzahl von Argumenten implementiert (finden Sie im Abschnitt "Faux variadics").Beispielsweise hat vector<T> "template <typename... Args> void emplace_back(Args&&... args)", die direkt ein Element vom Typ T an der Rückseite des Vektors von einer beliebigen Anzahl von Argumenten beliebigen erstellt, ohne weitergeleitet.Dies kann als push_back(T&&) effizienter sein, die eine zusätzliche Verschiebungskonstruktion und -zerstörung umfassen würde.

**Faux variadics:**Visual C++ in Visual Studio 2012 verfügt über ein neues Schema das Simulieren von variadic Vorlagen.In Visual C++ 2008 SP1 und in Visual C++ 2010 wurden Subheader wiederholt mit den Makros enthalten anders, die jedes Mal definiert wurden, um Überladungen für 0, 1, 2, 3 oder mehr Argumente auszurotten.Beispielsweise geschlossen hat <memory> den internen Subheader <xxshared> wiederholt ein, um make_shared<T>(args, args, args) auszurotten.In Visual C++ in Visual Studio 2012 werden die Subheader geht.Nun werden variadic Vorlagen selbst als Makros (mit vielen Schrägstrichfortsetzungen) definiert und dann erweitert, indem Vorlagenmakros verwendet.Diese interne Implementierungsänderung hat folgende Auswirkungen:

  • Der Code ist befinden, einfacher zu verwenden (Subheader hinzuzufügen war ein geeigneter umbrochenen Arbeit), und besser lesbar.

  • Mit dem Debugger sind Einzelschritte leider schwieriger.

  • Der pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>)-Konstruktor von std::pair hatte "interessante Effekte".Dies erfordert die Überladungen N^2 (wenn wir bis 10 Tupel unterstützen, diese bedeutet 121 Überladungen, da leere Tupel hier zählt, auch).

Wie viele PaarTupelüberladungen, sowie alle Stellungsüberladungen out spammend, Funktionen eine enorme des Arbeitsspeichers während der Kompilierung.Daher reduzierten wir unendlich.In Visual C++ 2008 SP1 und in Visual C++ 2010 war unendlich 10 (das heißt, "variadic" Vorlagen unterstützten 0 bis 10 Argumente, einschließlich).Standardmäßig ist Unendlich 5 in Visual C++ in Visual Studio 2012.Dies führt zu Compilerspeicherverbrauch zurück, was in Visual C++ 2010 war.Wenn Sie weitere Argumente erfordern (beispielsweise, wenn Sie vorhandenen Code haben, der 6 Tupel verwendet), gibt es eine Notluke.Sie können _VARIADIC_MAX definieren, die zwischen 5 und einschließlich 10) Projekt-weit ist.Dies beansprucht mehr Arbeitsspeicher und erforderlich sein, dass Sie die - Compileroption verwenden, /Zm mehr Speicherplatz für vorkompilierte Header zu reservieren.

**Zufallscharakter:**uniform_int_distribution ist jetzt perfekt unparteiisch, und shuffle() wird in <algorithm> implementiert, das direkt einheitliche Zufallszahlengeneratoren wie mersenne_twister akzeptiert.

Widerstand überladene Adressevon operators: C++98/03 verhindert ein Element eines STL-Containers vom Überladen von seinem Adressevon Adressoperator.Dies ist, was wie CComPtr tun klassifiziert, damit Hilfsklassen wie CAdapt erforderlich sind, um STL aus solchen Überladungen abzuschirmen.Während der Entwicklung von Visual C++ 2010 STL, ändert sie links, überladenen Adressevon operators in noch mehr Situationen ablehnen.C++11 ändert die Anforderungen, überladenen Adressevon operators akzeptabel auszuführen.C++11 und Visual C++ 2010, stellen die std::addressof() Hilfsfunktion, die die eigentliche Adresse eines Objekts unabhängig von Operatorüberladung abrufen kann.Bevor Visual C++ 2010 freigegeben wurde, versucht haben wir, Vorkommen von "&elem" durch "std::addressof(elem)" zu ersetzen, das beständig geeignet ist.In Visual C++ in Visual Studio 2012 haben wir weiter geht.Jetzt haben wir alle Container und alle Iteratoren überwacht, damit Klassen, die ihren Adressevon Adressoperator überladen, während STLs verwendbar sein sollten.

Visual C++ in Visual Studio 2012 geht über C++11 auf verschiedene Arten hinaus:

FURCHTSAME Iteratoren:, wie erlaubt aber nicht vom standardmäßigen C++11 erfordert, FURCHTSAME Iteratoren sind implementiert, wie von N2911 ", das minimiert Abhängigkeiten innerhalb der generischen Klassen für die schnelleren und kleineren Programme" und "FURCHTSAME Zuweisung des Iterator-N2980 und Initialisierung, Revision 1 " beschrieben.

Dateisystem: der <filesystem> Header von der Anforderung TR2 wurde hinzugefügt.Sie stellt recursive_directory_iterator und weitere interessante Funktionen an.Bevor Arbeit TR2 gesperrt wurde, da C++0x sehr spät lief und zu C++11 geändert wurde, wurde der Anforderung 2006 von Boost.Filesystem V2 abgeleitet.Es wurde später in Boost.Filesystem V3, aber der wird nicht in Visual C++ in Visual Studio 2012 implementiert.

Die eine zentrale Optimierung!Alle unsere Container sind jetzt ihre aktuellen Darstellungen angegeben optimal kleines.Dies bezieht sich auf die Containerobjekte selbst, nicht zu den gezeigte-zum Inhalt an.Beispielsweise enthält std::vector drei unformatierte Zeiger.In Visual C++ 2010 war x86-Releasemodus, std::vector 16 Bytes.In Visual C++ in Visual Studio 2012 ist es 12 Bytes, das optimal klein ist.Dies ist, Abkommen-wenn Sie 100.000 Vektoren im Programm haben, Visual C++ in Visual Studio 2012 können Sie 400.000 Bytes ein großes.Verringerte Speicherauslastung spart Platz und Zeit.

Dies wurde erreicht, indem die Speicherung von leeren Belegungsfunktionen und Vergleichsoperatoren vermied, da std::allocator und std::less zustandslos sind.(Diese Optimierungen werden für benutzerdefinierte Belegungsfunktionen/Vergleichsoperatoren auch aktiviert, solange sie zustandslos sind.Es kann Speicher von zustandsbehafteten Belegungsfunktionen/Vergleichsoperatoren nicht vermieden werden, jedoch sind sehr selten).

Hh567368.collapse_all(de-de,VS.110).gifContainer-Größen

Die folgenden Tabellen zeigen die Containergrößen, in Bytes, für x86- und x64-Plattformen an.(32-Bit-ARM ist auf x86 zu diesen Zwecken entspricht).Abdeckungsreleasemodus dieser Tabellen, da Debugmodus Überprüfungsmaschinerie enthält, die Leerzeichen und Zeit nutzt.Die separaten Spalten sind für Visual C++ 2008 SP1, in dem _SECURE_SCL zu 1 führt, und für Visual C++ 2008 SP1 mit _SECURE_SCL, das manuell bis 0 für Höchstgeschwindigkeit festgelegt ist.Visual C++ 2010 und Visual C++ in Visual Studio 2012 führen _SECURE_SCL auf 0 (jetzt wird als _ITERATOR_DEBUG_LEVEL).

x86-Container-Größen (Bytes)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

Vektor<int>

24

16

16

12

Array<int, 5>

20

20

20

20

Doppelschlange<int>

32

32

24

20

forward_list<int>

Nicht zutreffend

Nicht zutreffend

8

4

Liste<int>

28

12

12

8

priority_queue<int>

28

20

20

16

Warteschlange<int>

32

32

24

20

<int>Stapel

32

32

24

20

Paare<int, int>

8

8

8

8

Tupel<int, int, int>

16

16

16

12

Zuordnung<int, int>

32

12

16

8

Multimap<int, int>

32

12

16

8

legen Sie<int>fest

32

12

16

8

Multiset<int>

32

12

16

8

hash_map<int, int>

72

44

44

32

hash_multimap<int, int>

72

44

44

32

hash_set<int>

72

44

44

32

hash_multiset<int>

72

44

44

32

unordered_map<int, int>

72

44

44

32

unordered_multimap<int, int>

72

44

44

32

unordered_set<int>

72

44

44

32

unordered_multiset<int>

72

44

44

32

string

28

28

28

24

wstring

28

28

28

24

x64-Container-Größen (Bytes)

VC9 SP1

VC9 SP1

SCL=0

VC10

VC11

Vektor<int>

48

32

32

24

Array<int, 5>

20

20

20

20

Doppelschlange<int>

64

64

48

40

forward_list<int>

Nicht zutreffend

Nicht zutreffend

16

8

Liste<int>

56

24

24

16

priority_queue<int>

56

40

40

32

Warteschlange<int>

64

64

48

40

<int>Stapel

64

64

48

40

Paare<int, int>

8

8

8

8

Tupel<int, int, int>

16

16

16

12

Zuordnung<int, int>

64

24

32

16

Multimap<int, int>

64

24

32

16

legen Sie<int>fest

64

24

32

16

Multiset<int>

64

24

32

16

hash_map<int, int>

144

88

88

64

hash_multimap<int, int>

144

88

88

64

hash_set<int>

144

88

88

64

hash_multiset<int>

144

88

88

64

unordered_map<int, int>

144

88

88

64

unordered_multimap<int, int>

144

88

88

64

unordered_set<int>

144

88

88

64

unordered_multiset<int>

144

88

88

64

string

40

40

40

32

wstring

40

40

40

32

Kurzübersicht zu Visual C++-Versionsnummern

Visual C++ verfügt über verschiedene "Versionsnummern" abhängig davon, wo Sie suchen.Es gibt die Markierung Version (gedruckt auf dem Feld), die interne Version (im Dialogfeld angezeigt Info ) und die Compilerversion (angezeigt werden cl.exe und das _MSC_VER-Makro).

Markierung Versionsnummer

Interne Versionsnummer

#define _MSC_VER-Versionsnummer

Visual C++ 2005

VC8

1400

Visual C++ 2008

VC9

1500

Visual C++ 2010

VC10

1600

Visual C++ in Visual Studio 2012

VC11

1700

Das _MSC_VER-Makro ist an Personen interessant, die verschiedene Hauptversionen von Visual C++ abzielen und anderen Code für sie ausgeben möchten.

Siehe auch

Referenz

Lambda-Ausdrücke in C++

Bereichsbasiert für Anweisung (C++)

Weitere Ressourcen

Willkommen zurück in C++ modernes (C++)

C++-Sprachreferenz

C++-Standardbibliothek-Referenz

Visual C++-Team-Blog