C++, STL-String-Copy-Konstruktor - Immer eine Tiefe Kopie?
Ich habe gesehen, verschiedene widersprüchliche Verweise auf die Kopie-Konstruktor Verhalten von STL-strings in C++ und ich hatte gehofft, jemand könnte das für mich aufklären, angesichts des folgenden code-segment:
string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();
Macht das Objekt 's' bilden eine Tiefe Kopie des string-Objekts in der Funktion definiert 'str()'? oder ist das Objekt 's' einfaches zeigen auf den gleichen Speicherblock zugewiesen, während der string-Konstruktor-Aufruf in der 'str ()' - Funktion?
- Es spielt keine Rolle, was das exakte kopieren der Semantik sind, weil jeder vernünftige compiler optimieren wird, alle Kopien Weg in dem oben genannten Beispiel. Und wenn aus irgendeinem Grund dies nicht möglich ist, move-Semantik sind erforderlich, um kick in.
Du musst angemeldet sein, um einen Kommentar abzugeben.
String-Tiefe Kopie, die Sie nicht teilten den gleichen Puffer.
Sagte, dass bei der Rückgabe von einer Funktion die meisten guten Compiler kann entweder ein Return-Wert-Optimierung oder Copy elision, so dass Manöver ist nicht alles, was teuer (oder sogar kostenlos).
Wenn Sie mit c++11 move-Semantik angegeben werden, indem der standard so zur Sache wie return string sicher sein, dass der Schlimmste Fall (auch ohne Optimierungen) ist ziemlich Billig.
BEARBEITEN: zusammenfassen, werden Sie garantiert, dass die Zeichenfolge, die Sie "besitzen" ein einmaliges Stück Erinnerung, die beibehalten wird, mindestens die Lebensdauer des lokalen string. Allerdings ist es mehr als wahrscheinlich, dass der compiler nicht kopieren es aus dem string in der Funktion, sondern nur tauschen Sie die Zeiger oder selbst erstellte kopieren insgesamt (also der string in der Funktion wäre eigentlich die Zeichenfolge, die Sie zuweisen zu).
std::string
ist lustig (= gebrochen) Aufhebungs-Semantik, weil es. KUH ist nicht erlaubt, für "wahr" STL-Containern. KUH-string ist eine kaputte Idee, da wurde jedem bewusst, nur zu spät.noexcept
. Die KUH crazy-ness, wurde behoben.Ja, es führt eine logische Tiefe Kopie.
Vom N3126, 21.4.2 Tabelle 61: