Heim > Backend-Entwicklung > C++ > Wie wirken sich C 11-Rvalue-Referenzen und Move-Semantik auf Return-Anweisungen aus?

Wie wirken sich C 11-Rvalue-Referenzen und Move-Semantik auf Return-Anweisungen aus?

Barbara Streisand
Freigeben: 2024-12-24 12:42:15
Original
669 Leute haben es durchsucht

How Do C  11 Rvalue References and Move Semantics Affect Return Statements?

C 11 R-Werte und Bewegungssemantik mit Return-Anweisung

R-Wert-Referenzen und Bewegungssemantik verstehen

In C 11, R-Wert Referenzen und Verschiebungssemantik wurden eingeführt, um die Leistung und Effizienz bei der Arbeit mit temporären Werten zu verbessern. Eine R-Wert-Referenz (&&) bezieht sich auf ein temporäres Objekt, während die Verschiebungssemantik es uns ermöglicht, den Inhalt eines Objekts in ein anderes zu verschieben, ohne ihn zu kopieren.

Beispiel 1

std::vector<int> return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();
Nach dem Login kopieren

In diesem Beispiel gibt die Funktion return_vector ein temporäres std::vector-Objekt zurück, das von der Rvalue-Referenz rval_ref abgefangen wird. Da das temporäre Objekt in rval_ref verschoben wird, wird das Kopieren effektiv verhindert.

Beispiel 2

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();
Nach dem Login kopieren

In diesem Fall gibt die Funktion return_vector den temporären Standard zurück: :vector-Objekt nach Wert und verwendet die Funktion std::move, um den Inhalt des temporären Objekts explizit in das zurückgegebene Objekt zu verschieben. Dadurch entsteht ein Laufzeitfehler, da rval_ref jetzt einen Verweis auf das zerstörte temporäre Objekt enthält.

Beispiel 3

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();
Nach dem Login kopieren

Dieses Beispiel ähnelt Beispiel 1, wobei das Die Funktion return_vector gibt das temporäre std::vector-Objekt nach Wert zurück und verwendet std::move, um den Inhalt zu verschieben. In diesem Fall ist std::move jedoch unnötig und kann die Leistung beeinträchtigen, indem es die Optimierung des Rückgabewerts verhindert.

Best Practice

Der beste Ansatz ist die Verwendung von Beispiel 4, wobei das temporäre Objekt implizit in das zurückgegebene Objekt verschoben wird, ohne dass std::move explizit verwendet wird. Der Compiler führt eine Rückgabewertoptimierung (RVO) durch, um unnötiges Kopieren zu vermeiden.

std::vector<int> return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie wirken sich C 11-Rvalue-Referenzen und Move-Semantik auf Return-Anweisungen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage