C 11 R-Wert-Referenzen und Bewegungssemantik: Rückgabewerte enträtseln
Im Bereich C 11 ist das Verständnis von R-Wert-Referenzen und Bewegungssemantik von entscheidender Bedeutung . Ziel dieses Artikels ist es, die Unterschiede zwischen drei Codebeispielen zu verdeutlichen und zu bestimmen, welches Vektorduplizierung vermeidet.
Erstes Beispiel
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector();
Hier gibt die Funktion eine lokale Variable zurück, tmp, nach Wert. Die Referenz rval_ref bindet an eine Kopie von tmp. Dies ähnelt:
const std::vector<int> &rval_ref = return_vector();
außer dass rval_ref nicht für nicht konstante Operationen verwendet werden kann.
Zweites Beispiel
std::vector<int> &&return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
Dies Beispiel versucht fälschlicherweise, eine verschobene lokale Variable, tmp, zurückzugeben. Da tmp beim Beenden der Funktion zerstört wird, enthält rval_ref eine fehlende Referenz. Dies führt wahrscheinlich zu einem Laufzeitfehler.
Drittes Beispiel
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
Dieses Beispiel ähnelt dem ersten, bei dem tmp als Wert zurückgegeben wird. Der std::move-Aufruf ist redundant und kann die Leistung beeinträchtigen, indem er die Rückgabewertoptimierung (RVO) deaktiviert.
Best Practice
Für eine optimale Leistung verwenden Sie den folgenden Ansatz:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
Die lokale Variable tmp wird in der Return-Anweisung implizit als R-Wert behandelt. Der Compiler wendet RVO an und vermeidet Kopien oder Verschiebungen oder verwendet bei Bedarf den Verschiebungskonstruktor.
Das obige ist der detaillierte Inhalt vonWie können C 11-Rvalue-Referenzen und Move-Semantik Vektorrückgabewerte optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!