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!