Heim >Backend-Entwicklung >C++ >Sollten wir „std::string' und „std::vector' trotzdem durch „const &' übergeben?
Ü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:
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!