Heim >Backend-Entwicklung >C++ >Sollten wir „std::string' trotzdem als „const std::string&'-Referenz übergeben?

Sollten wir „std::string' trotzdem als „const std::string&'-Referenz übergeben?

DDD
DDDOriginal
2024-12-10 00:27:16324Durchsuche

Should We Still Pass `std::string` by `const std::string&` Reference?

Die Obsoleszenz des Passing const std::string& Referenzen: Herb Sutters Perspektive

In einem kürzlichen Vortrag brachte Herb Sutter die abnehmende Relevanz von zum Ausdruck Übergabe von std::vector und std::string durch const&. Er schlug vor, dass der traditionelle Ansatz:

std::string do_something(const std::string& inval)

jetzt weniger wünschenswert ist im Vergleich zu:

std::string do_something(std::string inval)

Obwohl anerkannt ist, dass Inval seine Größe behält, basiert Herbs Argument auf Szenarien mit Funktionsverkettung. Betrachten Sie das Beispiel, in dem A B aufruft, das wiederum C aufruft:

Fall 1: Übergabe durch const-Referenz

void B(const std::string& str) { C(str); }
void C(const std::string& str) { /* Use str but do not store it */ }

Wenn C Speicher benötigt, ist ein Kopiervorgang erforderlich wird notwendig:

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

Die Verwendung von const& verhindert jedoch, dass C auf die zugrunde liegenden Daten zugreift, die in seine verschoben wurden Parameter.

Fall 2: Wertübergabe

void B(std::string str) { C(std::move(str)); }
void C(std::string str) { m_str = std::move(str); }

In diesem Szenario wird die Zeichenfolge durch die Funktionsaufrufe verschoben, um unnötige Kopien zu vermeiden. Der Leistungsaufwand beim Verschieben in einen Wert wird durch die Vorteile der Vermeidung von Speicherzuweisungen für kleine Zeichenfolgen mit Short String Optimization (SSO) ausgeglichen.

Letztendlich hängt die Wahl zwischen der Übergabe per Konstantenreferenz oder Wert von der spezifischen Verwendung ab Fall und die Präferenz des Entwicklers für Speicherzuteilungseffizienz gegenüber potenziellen Leistungseinbußen.

Das obige ist der detaillierte Inhalt vonSollten wir „std::string' trotzdem als „const std::string&'-Referenz ü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