C ++ STL String Kopieren Konstruktor - Immer eine tiefe Kopie?

8

Ich habe verschiedene widersprüchliche Verweise auf das Kopierkonstruktorverhalten von STL-Strings in C ++ gesehen, und ich hatte gehofft, dass jemand dies für mich mit dem folgenden Codesegment klären könnte:

%Vor%

Entspricht das Objekt einer tiefen Kopie des in der Funktion 'str ()' definierten String-Objekts? Oder zeigt das Objekt einfach auf denselben Speicherbereich, der während des Aufrufs des Zeichenfolgenkonstruktors in der Funktion 'str ()' zugewiesen wurde?

    
Gearoid Murphy 11.12.2011, 20:06
quelle

2 Antworten

3

String wird tief kopieren, sie teilen nicht den gleichen Puffer.

Das heißt, wenn sie von einer Funktion zurückgegeben werden, können die meisten guten Compiler entweder die Rückgabewert-Optimierung oder die Kopie-Elision verwenden, so dass das Manövrieren nicht so teuer (oder sogar kostenlos) ist.

Wenn Sie c ++ 11 verwenden, dann sind die Verschiebungssemantiken durch den Standard spezifiziert, so dass Sie für eine Sache wie den Return-String sicher sein können, dass der schlimmste Fall (auch ohne Optimierungen) ziemlich billig ist.

BEARBEITEN: zusammenfassend, Sie werden garantiert, dass die Schnur, die Sie "besitzen", einen einzigartigen Klotz des Gedächtnisses hat, der für mindestens die Lebenszeit der lokalen Schnur fortbesteht. Es ist jedoch mehr als wahrscheinlich, dass der Compiler es nicht aus der Zeichenkette der Funktion kopiert, sondern einfach seine Zeiger vertauscht oder die Kopie sogar komplett kopiert (was bedeutet, dass die Zeichenkette in der Funktion auch die Zeichenkette ist, die Sie zuweisen) / p>     

111111 11.12.2011, 20:09
quelle
1

Ja, es führt eine logische tiefe Kopie durch.

Von N3126 , 21.4.2, Tabelle 61 :

  

data() - zeigt auf das erste Element einer zugewiesenen Kopie   des Arrays, auf das auf das erste Element gezeigt wird    str.data()

    
Oliver Charlesworth 11.12.2011 20:09
quelle