C ++ AWL-Vektor: Push_back nimmt Bezug

8

Aus der cpp-Dokumentation für std::vector sehe ich Folgendes:

%Vor%

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.

    
sachin2182 01.08.2012, 15:24
quelle

3 Antworten

12

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:

%Vor%

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:

%Vor%     
ecatmur 01.08.2012, 15:28
quelle
7

Die object , die Sie drücken, wird als Referenz übergeben, um extra copy zu vermeiden. Dann wird eine Kopie in vector platziert.

    
Andrew 01.08.2012 15:25
quelle
7

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.

    
Jerry Coffin 01.08.2012 15:44
quelle

Tags und Links