Aus der cpp-Dokumentation für std::vector
sehe ich Folgendes:
Ich verstehe, dass push_back
eine Kopie des Objekts erstellt, das ich überlasse. Aber, warum ist die Signatur const T& ?
Wenn ich mir das anschaue, dachte ich zunächst, dass es eine const
Referenz von jedem Objekt, das ich an die vector
drücke, benötigt.
Die andere Option wäre
%Vor% das heißt, x
nach Wert zu übernehmen. Dies würde jedoch (in C ++ 03) dazu führen, dass eine zusätzliche Kopie von x
erstellt wird (die Kopie in den Argumenten für push_back
). Die Verwendung von x
durch const-Referenz vermeidet dies.
Schauen wir uns den Stack für einen Aufruf v.push_back(T())
nach Wert an:
Durch const Referenz erhalten wir:
%Vor% In C ++ 11 wäre es möglich (wenn auch unnötig), x
nach Wert zu verwenden und std::move
zu verwenden, um es auf den Vektor zu verschieben:
Nur um die "Extra-Kopie" zu verdeutlichen, beschreibt @ecatmur, dass, wenn push_back
sein Argument nach Wert erhalten hat, es passieren würde, dass Sie mit Ihrem Objekt beginnen würden. Eine Kopie davon würde als Parameter an push_back
übergeben. Dann würde push_back
eine Kopie von das erstellen, die in den Vektor selbst eingefügt werden soll.
Da die reale Implementierung von push_back
ihr Argument als Referenz erhält, erstellt sie ( push_back
) das neue Objekt im Vektor direkt als eine Kopie Ihres ursprünglichen Objekts.
Wie schon erwähnt, ja, mit C ++ 11 unter Verwendung der move-Semantik wäre es möglich (obwohl wahrscheinlich nicht besonders vorteilhaft), das Argument nach Wert zu übergeben und dann den Wert von diesem Argument in das neue Objekt in der Vektor. Wenn das, was Sie in den Vektor eingefügt haben, eine Zeichenfolge ist, die meistens nur einen Zeiger und ein paar "Buchhaltungs" -Felder enthält (Menge des zugewiesenen Speichers, Menge des momentan verwendeten Speichers), wäre das fast ist so effizient wie das Übergeben einer Referenz, weil eine Bewegung nur eine oberflächliche Kopie erstellen kann - kopieren Sie die Zeiger- und Buchhaltungswerte selbst statt aller Daten, auf die sie zeigt. Wenn jedoch das fragliche Objekt alle seine Daten direkt hält (d. H. Kein Zeiger), wäre eine Bewegung genauso langsam wie eine Kopie.
Durch Referenzieren wird vermieden, dass all kopiert wird. Selbst für eine Zeichenfolge ist es im Allgemeinen schneller (für einen Fall wie dieses kann das ursprüngliche Objekt nicht ungültig gemacht werden). Es hat auch den kleinen Vorteil, mit C ++ 98/03 und nicht nur mit C ++ 11 zu arbeiten.