Heim >Backend-Entwicklung >C++ >Sollten wir std::string trotzdem durch const & übergeben?
Die vergangene Ära von Const Std::string & Parameters
In einer kürzlichen Diskussion äußerte Herb Sutter die Vorstellung, dass die vorherrschende Praxis von Die Übergabe von std::vector und std::string durch const & Parameter hat möglicherweise nicht mehr das gleiche Gewicht. Seine vorgeschlagene Alternative, diese Objekte nach Wert zu übergeben, hat eine Debatte ausgelöst und Fragen aufgeworfen.
Den Übergang verstehen
Warum hat Sutter diesen Wandel befürwortet? Der Hauptgrund liegt in Szenarien, die dem unten beschriebenen ähneln:
Stellen Sie sich eine Funktion A vor, die Funktion B aufruft, die wiederum Funktion C aufruft. Funktion A leitet eine Zeichenfolge durch B und in C weiter und behält dabei ihre Unwissenheit bei Die Existenz von C.
Der Const &-Ansatz:
Wenn B und C die Zeichenfolge als const & erhalten Parametern erfolgen die Interaktionen wie folgt:
void B(const std::string &str) { C(str); } void C(const std::string &str) { // Manipulates `str` but does not store it. }
Dieser Ansatz zirkuliert effektiv Zeiger und vermeidet unnötiges Kopieren oder Verschieben. C akzeptiert const &, da die Zeichenfolge nur verwendet und nicht gespeichert werden soll.
Der Wertansatz:
Wenn die Funktionalität von C jedoch die Speicherung der Zeichenfolge erfordert , wird folgende Änderung vorgenommen:
void C(const std::string &str) { // Manipulates `str`. m_str = str; }
Wie Sie sehen, verwendet C den String nicht mehr nur, sondern speichert ihn auch. Die Bewegungssemantik von C 11 sollte theoretisch unnötiges Kopieren verhindern, aber die Konstanten und Parameter von C verhindern dies. Stattdessen kommen der Kopierkonstruktor und die mögliche Speicherzuweisung ins Spiel.
Durch Umgehen von Const &:
Durch Umgehen von const & Parameter und Übergeben der Zeichenfolge als Wert durch alle Funktionen wird dies beseitigt Ausgabe. std::move kann die Daten bei Bedarf effizient mischen. Wenn eine Funktion beabsichtigt, die Zeichenfolge beizubehalten, kann sie dies tun.
Überlegungen zur Leistung:
Die Übergabe von Werten verursacht im Vergleich zur Verwendung von Referenzen einen höheren Leistungsaufwand. Bei kleinen Strings, die von SSO profitieren, sind die Kosten jedoch vernachlässigbar.
Fazit
Die Entscheidung, ob std::string durch const & oder value übergeben werden soll, hängt davon ab der spezifische Anwendungsfall und seine Empfindlichkeit gegenüber Speicherzuweisungen. Auch wenn die Wertüberschreitung möglicherweise nicht allgemein zu bevorzugen ist, bietet sie in bestimmten Situationen überzeugende Vorteile.
Das obige ist der detaillierte Inhalt vonSollten wir std::string trotzdem durch const & übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!