Überdenken der Wertübergabe in C 11
In traditionellem C führte die Wertübergabe in Funktionen zu Leistungseinbußen bei großen Objekten . Daher entschieden sich C-Programmierer für „Pass-by-Reference“, was die Geschwindigkeit steigerte, aber auch Komplexitäten bei der Besitz- und Speicherverwaltung mit sich brachte, insbesondere für Heap-zugewiesene Objekte.
C 11 führte Rvalue-Referenzen und Verschiebungskonstruktoren ein und ermöglichte so ein effizientes Pass-by -Wert für große Objekte wie std::vector und std::string. Dies wirft die Frage auf, ob die Wertübergabe zur Standardeinstellung für solche Typen werden sollte.
Wertübergabe: Eine neue Standardeinstellung?
Laut Dave Abrahams Die Wertübergabe kann die bevorzugte Standardeinstellung sein, wenn innerhalb der Funktion ein Kopieren erforderlich ist. Indem Programmierer das Kopieren dem Compiler überlassen, können sie explizite Kopiervorgänge vermeiden:
void foo(T t) { // ... }
Im Vergleich zur Referenzübergabe:
void foo(T const& t) { auto copy = t; // ... }
Pass-by-Value bietet Flexibilität für den Aufrufer :
T lval; foo(lval); // copy from lvalue foo(T {}); // (potential) move from prvalue foo(std::move(lval)); // (potential) move from xvalue
Ausnahmen von Wertübergabe
Während die Wertübergabe für einige Typen geeignet sein kann, bleibt die Übergabe per Referenz an const eine sinnvolle Option:
Das obige ist der detaillierte Inhalt vonSollte Pass-by-Value die Standardeinstellung in C 11 für große Objekte sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!