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.
VC10 |
VC11 |
|
---|---|---|
v2.0 |
v2.1* |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Ja |
Ja |
|
v1.0 |
v1.0 |
|
Ja |
Ja |
|
v1.0 |
v1.1 |
|
v1.0 |
v1.1** |
|
Ja |
Ja |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Ja |
Ja |
|
Ja |
Ja |
|
Partial |
Ja |
|
Nein |
Ja |
|
Nein |
Nein |
|
Nein |
Nein |
|
TR1 |
Partial |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Ja |
|
Nein |
Nein |
|
Ja |
Ja |
|
Nein |
Nein |
|
Nein |
Nein |
|
Nein |
Nein |
|
Ja |
Ja |
|
Nein |
Ja |
|
Partial |
Ja |
|
Ja |
Ja |
|
Nein |
Nein |
Sprachfunktionen des Kern-C++11: Parallelität |
VC10 |
VC11 |
---|---|---|
Nicht zutreffend |
Nicht zutreffend |
|
Nein |
Ja |
|
Nein |
Ja |
|
Nein |
Ja |
|
Nicht zutreffend |
Nicht zutreffend |
|
Nein |
Ja |
|
Nein |
Nein |
|
Ja |
Ja |
|
Nein |
Nein |
|
Nein |
Nein |
|
Partial |
Partial |
|
Nein |
Nein |
Sprachfunktionen des Kern-C++11: C99 |
VC10 |
VC11 |
---|---|---|
Partial |
Partial |
|
Partial |
Partial |
|
Ja |
Ja |
|
Nicht zutreffend |
Nicht zutreffend |
Hier ist eine Kurzanleitung zu den Informationen in den Tabellen.
Rvalue-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.
Vorsicht |
---|
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. |
Lambdas
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.
decltype
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.
Stark 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.
Ausrichtung
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.
Standard-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.
Ü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.
Atomphysik 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.
Standardbibliotheks-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).
Container-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
Bereichsbasiert für Anweisung (C++)
Weitere Ressourcen
Willkommen zurück in C++ modernes (C++)