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

Sollten wir „std::string' und „std::vector' trotzdem durch „const &' übergeben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-10 13:54:11972Durchsuche

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

Überarbeitung der Konventionen zur Parameterübergabe zur Optimierung

In einem aktuellen Vortrag schlug Herb Sutter die Übergabe von std::vector- und std::string-Objekten vor von const & ist veraltet. Diese Behauptung hat Diskussionen unter Programmierern ausgelöst.

Sutters Begründung

Sutter argumentiert, dass in Fällen, in denen die Funktion einen R-Wert (d. h. ein temporäres Objekt) zurückgibt, die Eingabe übergeben wird Parameter nach Wert ermöglicht eine effizientere Handhabung mithilfe der Bewegungssemantik. Dadurch werden unnötige Kopien oder Speicherzuweisungen vermieden.

Bedenken Sie den folgenden Codeausschnitt:

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

Durch die Übergabe von inval als Wert kann die Funktion den Wert direkt ändern und zurückgeben, sodass keine Kopie erforderlich ist Konstrukteur.

Bedenken hinsichtlich der Effizienz

Kritiker argumentieren, dass die Übergabe großer Objekte wie std::string nach Wert aufgrund des Mehraufwands beim Verschieben des Objekts immer noch ineffizient sein kann. Eine std::string-Instanz besteht aus mehreren Komponenten, einschließlich eines Heap-Zeigers und eines Mitglieds char[] zur Optimierung kurzer Zeichenfolgen.

Argumente für Referenzparameter

Trotz der Obwohl es potenzielle Ineffizienzen gibt, argumentieren Befürworter von Referenzparametern, dass diese mehrere bieten Vorteile:

  • Kapselung:Funktionen, die Referenzen annehmen, machen deutlich, dass sie das Originalobjekt nicht verändern.
  • Reduzierte Komplexität: Referenzparameter vereinfachen den Code, da Eigentum und Lebensdauer nicht mehr berücksichtigt werden müssen Management.

Fazit

Die Wahl, ob Objekte per Konstante und oder per Wert übergeben werden sollen, hängt vom jeweiligen Anwendungsfall ab. In Situationen, in denen die Effizienz von entscheidender Bedeutung ist und die Funktion mit R-Werten arbeitet, kann die Wertübergabe mit Verschiebungssemantik Leistungsvorteile bieten. In Fällen, in denen Kapselung, Einfachheit oder Eigentumsverwaltung wichtig sind, bleiben Referenzparameter jedoch weiterhin wertvoll.

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