Pass-by-Value in C 11: Eine Neubewertung
In C 11 hat die Einführung von R-Wert-Referenzen und Verschiebungskonstruktoren eine ausgelöst Debatte: Sollte die Wertübergabe zum Standardwert für Werte werden? Typen?
Ursprünge von Pass-by-Reference
In der Vergangenheit war die Übergabe großer Objekte nach Wert in C aufgrund unnötigen Kopierens ineffizient. Referenzparameter wurden bevorzugt, um kostspielige Duplikate zu vermeiden. Referenzen führten jedoch zu Komplexitäten bei der Besitz- und Speicherverwaltung, insbesondere für Heap-zugewiesene Objekte.
Das neue Paradigma in C 11
Mit R-Wert-Referenzen und Verschiebungskonstruktoren ist es Es ist jetzt möglich, Werttypen wie std::vector und std::string zu implementieren, die kostengünstig als Wert übergeben werden können. Dies wirft die Frage auf: Sollte die Wertübergabe der neue Standard für diese Typen sein?
Empfehlungen
Laut Dave Abrahams wird die Wertübergabe empfohlen, wenn a Innerhalb der Funktion ist eine Kopie erforderlich. Dadurch kann der Compiler die Kopie optimieren, wie im folgenden Beispiel zu sehen ist:
void foo(T t) { // ... }
Dies kann flexibel verwendet werden, um L-Werte, Pr-Werte oder X-Werte zu übergeben:
T lval; foo(lval); // copy from lvalue foo(T {}); // (potential) move from prvalue foo(std::move(lval)); // (potential) move from xvalue
Ausnahmen
Die Weitergabe von Referenzen an const bleibt eine sinnvolle Option für bestimmte Szenarien, in denen eine Kopie unnötig ist oder unerwünscht. In solchen Fällen kann die folgende Syntax verwendet werden:
class T { U u; V v; public: T(U u, V v) : u(std::move(u)) , v(std::move(v)) {} };
Schlussfolgerung
In C 11 ist die Übergabe von Werten eine überzeugende Option für Werttypen, die erfordern das Kopieren innerhalb von Funktionen. Es vereinfacht die Parameterverwaltung und ermöglicht effiziente Verschiebungsvorgänge. Allerdings bleibt die Referenzübergabe an const eine geeignete Alternative in Fällen, in denen keine Kopie erforderlich ist.
Das obige ist der detaillierte Inhalt vonSollte Pass-by-Value die Standardeinstellung für Werttypen in C 11 sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!