Heim >Backend-Entwicklung >C++ >Sollten Sie „std::string' und „std::vector' als Wert- oder Konstantenreferenz übergeben?

Sollten Sie „std::string' und „std::vector' als Wert- oder Konstantenreferenz übergeben?

Susan Sarandon
Susan SarandonOriginal
2024-12-29 00:22:10710Durchsuche

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

Übergabe von Parametern nach Wert: Überdenken von const std::string &

Herb Sutter stellte kürzlich die herkömmliche Praxis der Übergabe von std::vector und in Frage std::string-Objekte nach Konstantenreferenz. Er schlägt vor, dass es in vielen Fällen jetzt vorzuziehen ist, sie als Wert zu übergeben, wie im folgenden Code gezeigt:

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

Während der Rückgabewert am Punkt der Funktionsrückgabe ein R-Wert ist und kostengünstig verschoben werden kann, Tatsächlich liegt der Grund für Sutters Aussage in Fällen wie diesem:

Stellen Sie sich eine Funktion A vor, die Funktion B aufruft, die wiederum Funktion C aufruft. A übergibt eine Zeichenfolge Parameter an B, das ihn an C weiterleitet. A hat keine direkte Kenntnis von C.

Wenn B und C die Zeichenfolge als Konstantenreferenz nehmen, würde der Code wie folgt aussehen:

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

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

Bei diesem Ansatz reicht das Übergeben und Empfangen von Zeigern aus, wodurch kostspieliges Kopieren oder Verschieben vermieden wird.

Wenn C jedoch die speichern muss string:

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

Dies löst einen Kopierkonstruktor und eine mögliche Speicherzuweisung aus (ohne Berücksichtigung der Short-String-Optimierung). Während die Bewegungssemantik von C 11 darauf abzielt, unnötiges Kopieren zu vermeiden, verhindert die Verwendung einer const-Referenz in C dies, obwohl A eine temporäre Zeichenfolge übergibt.

Umgekehrt, wenn str als Wert durch alle Funktionen übergeben würde, verlässt man sich bei der Übertragung auf die Bewegungssemantik Besitz, C könnte die Daten entweder übernehmen oder verwerfen, ohne einen Kopiervorgang auszulösen. Dieser Ansatz bringt einen leichten Leistungsaufwand mit sich, eliminiert jedoch Speicherzuweisungen, was je nach Anwendungsfall von Vorteil sein kann.

Das obige ist der detaillierte Inhalt vonSollten Sie „std::string' und „std::vector' als Wert- oder Konstantenreferenz übergeben?. 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