Zusätzlich zu dem, was der Besucher sagte:
Die void emplace_back(Type&& _Val)
von MSCV10 bereitgestellte Funktion ist nicht konform und redundant, da sie, wie Sie bemerkt haben, streng gleichwertig ist mit push_back(Type&& _Val)
.
Aber die echte C ++ 0x-Form von emplace_back
ist wirklich nützlich : void emplace_back(Args&&...)
;
Anstatt a zu nehmen value_type
, wird eine variable Liste von Argumenten verwendet, was bedeutet, dass Sie die Argumente jetzt perfekt weiterleiten und ein Objekt direkt in einen Container ohne temporäre Elemente konstruieren können.
Das ist nützlich, denn egal wie viel Klugheit RVO und Bewegungssemantik auf den Tisch bringen, es gibt immer noch komplizierte Fälle, in denen ein push_back wahrscheinlich unnötige Kopien (oder Verschiebungen) erstellt. Zum Beispiel müssen Sie mit der traditionellen insert()
Funktion von a std::map
eine temporäre Funktion erstellen, die dann in a kopiert std::pair<Key, Value>
wird und dann in die Karte kopiert wird:
std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";
// cross your finger so that the optimizer is really good
m.insert(std::make_pair(4, Complicated(anInt, aDouble, aString)));
// should be easier for the optimizer
m.emplace(4, anInt, aDouble, aString);
Warum haben sie nicht die richtige Version von emplace_back in MSVC implementiert? Eigentlich hat es mich vor einiger Zeit auch nervt, also habe ich die gleiche Frage im Visual C ++ - Blog gestellt . Hier ist die Antwort von Stephan T Lavavej, dem offiziellen Betreuer der Implementierung der Visual C ++ - Standardbibliothek bei Microsoft.
F: Sind Beta 2 Emplace-Funktionen derzeit nur eine Art Platzhalter?
A: Wie Sie vielleicht wissen, sind in VC10 keine variablen Vorlagen implementiert. Wir simulieren sie mit Präprozessor-Maschinen für Dinge wie
make_shared<T>()
Tupel und die neuen Dinge in <functional>
. Diese Präprozessor-Maschine ist relativ schwierig zu bedienen und zu warten. Dies wirkt sich auch erheblich auf die Kompilierungsgeschwindigkeit aus, da wir wiederholt Unterüberschriften einbeziehen müssen. Aufgrund einer Kombination aus Zeitbeschränkungen und Bedenken hinsichtlich der Kompilierungsgeschwindigkeit haben wir in unseren Emplace-Funktionen keine variablen Vorlagen simuliert.
Wenn verschiedene Vorlagen im Compiler implementiert sind, können Sie davon ausgehen, dass wir sie in den Bibliotheken, einschließlich unserer Emplace-Funktionen, nutzen. Wir nehmen Konformität sehr ernst, aber leider können wir nicht alles auf einmal tun.
Es ist eine verständliche Entscheidung. Jeder, der nur einmal versucht hat, eine variable Vorlage mit schrecklichen Tricks des Präprozessors zu emulieren, weiß, wie ekelhaft dieses Zeug wird.