Heim >Backend-Entwicklung >C++ >Ist die Übergabe von „std::string' durch „const std::string&' in modernem C immer noch von Vorteil?

Ist die Übergabe von „std::string' durch „const std::string&' in modernem C immer noch von Vorteil?

Susan Sarandon
Susan SarandonOriginal
2024-12-22 05:38:14658Durchsuche

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

Bietet die Übergabe von Const std::string & als Parameter noch weitere Vorteile?

In einem aktuellen Vortrag schlug der renommierte C-Experte Herb Sutter vor dass die Argumente für die Übergabe von std::vector und std::string durch const & nicht mehr zwingend sind. Zur Veranschaulichung schlug er eine Funktion vor, die wie folgt geschrieben wurde:

std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}

Herb kam zu dem Schluss, dass der return_val zum Zeitpunkt der Funktionsrückgabe ein R-Wert wäre und mit einer kostengünstigen Bewegungssemantik zurückgegeben werden könnte. Es bleibt jedoch die Frage: Warum wird der Eingabeparameter inval als Referenz übergeben? Macht die größere Größe eines std::string-Objekts (aufgrund von Komponenten wie dem Heap-Zeiger und dem char-Array) die Wertübergabe nicht vorteilhafter?

Herbs Begründung

Herbs Vorschlag stammt aus Szenarien, in denen mehrere verschachtelte Funktionen beteiligt sind. Stellen Sie sich eine Situation vor, in der Funktion A Funktion B aufruft, die wiederum Funktion C aufruft und jeweils einen Zeichenfolgenparameter übergibt. Wenn B und C die Zeichenfolge als const & verwenden, könnte der Code so aussehen:

void B(const std::string & str) {
  C(str);
}

void C(const std::string & str) {
  // Use `str` without storing it.
}

Dieser Ansatz gibt Zeiger effizient weiter und vermeidet das Kopieren oder Verschieben. C benötigt eine Konstante &, da die Zeichenfolge nicht gespeichert wird.

Angenommen, C muss jetzt die Zeichenfolge speichern. Eine Änderung von C wie folgt zwingt B dazu, eine Kopie in seinen Parameter durchzuführen, wodurch jeglicher Vorteil zunichte gemacht wird:

void C(const std::string & str) {
  // ...
  m_str = str;
}

Im Gegensatz dazu, wenn str in allen Funktionen als Wert übergeben würde und man sich auf std::move to verlässt Um die Datenverschiebung zu bewältigen, könnte C einfach das Eigentum an der temporären Zeichenfolge übernehmen, wodurch die Notwendigkeit von Kopien entfällt.

Kosten Überlegungen

Während die Übergabe nach Wert im Vergleich zur Verwendung von Referenzen zu einer leichten Leistungseinbuße führt, kann sie mit den Kosten für das Kopieren kleiner Zeichenfolgen mit SSO vergleichbar sein. Die Wahl zwischen diesen Ansätzen hängt von der Häufigkeit der Speicherzuweisungen und dem spezifischen Anwendungsfall ab.

Das obige ist der detaillierte Inhalt vonIst die Übergabe von „std::string' durch „const std::string&' in modernem C immer noch von Vorteil?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn