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?
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>
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 wirdstr.data()
Tags und Links string memory c++ copy-constructor