R-Wert-Referenzen und Bewegungssemantik in C 11 Unraveled
In C 11 bieten R-Wert-Referenzen und Bewegungssemantik leistungsstarke Techniken zur Verbesserung von Leistung und Effizienz . In diesem Artikel werden die Nuancen dieser Konzepte anhand einer detaillierten Analyse von drei Beispielen untersucht:
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();
In diesem Beispiel gibt die Funktion return_vector einen temporären Wert zurück Vektorobjekt nach Wert. Die rvalue-Referenz rval_ref bindet an dieses temporäre Objekt. Die Lebensdauer des temporären Objekts wird über den Funktionsaufruf hinaus verlängert, sodass rval_ref weiterhin auf seine Daten zugreifen kann. Über rval_ref vorgenommene Änderungen wirken sich jedoch nicht auf den ursprünglichen Vektor aus.
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();
Dieses Beispiel ist aufgrund eines Laufzeitfehlers fehlerhaft. Die Funktion return_vector verwendet std::move für den temporären Vektor tmp, bevor sie ihn zurückgibt. Dadurch wird tmp effektiv zerstört und rval_ref enthält einen Verweis auf ungültigen Speicher. Folglich kann dieser Code bei der Ausführung abstürzen.
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();
Ähnlich wie im ersten Beispiel verwendet dieses Beispiel std::move für den temporären Vektor tmp, bevor es als Wert zurückgegeben wird. Da die Funktion jedoch bereits als Wert zurückgibt, ist std::move überflüssig und kann aufgrund zusätzlicher Speicheroperationen zu einer Leistungseinbuße führen.
Best Practice:
Die bevorzugte Art, diesen Code zu schreiben, besteht darin, den unnötigen std::move wegzulassen und sich im Gegenzug auf die implizite Konvertierung von R-Werten in C 11 zu verlassen Anweisungen:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
In diesem Fall optimiert der Compiler die Rückgabe mithilfe der Rückgabewertoptimierung (RVO), um unnötiges Kopieren oder Verschieben zu vermeiden. Wenn RVO nicht möglich ist, verwendet der Compiler alternativ den Verschiebungskonstruktor der Vektorklasse, um eine effiziente Eigentumsübertragung durchzuführen.
Das obige ist der detaillierte Inhalt vonWie verbessern Rvalue-Referenzen und Move-Semantik die C 11-Leistung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!