Heim >Backend-Entwicklung >C++ >Wie wirken sich Rvalue-Referenzen und Move-Semantik auf C 11-Rückgabeanweisungen aus?

Wie wirken sich Rvalue-Referenzen und Move-Semantik auf C 11-Rückgabeanweisungen aus?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-21 15:11:10567Durchsuche

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

R-Wert-Referenzen und Verschiebungssemantik in C 11 mit Rückgabeanweisungen

C 11 führte R-Wert-Referenzen und Verschiebungssemantik ein, um die Leistung durch die Vermeidung unnötiger Kopien und die Optimierung der Objekterstellung zu verbessern. Das Verständnis der Unterschiede zwischen diesen Techniken ist entscheidend für das Schreiben von effizientem Code.

Beispielanalyse

Betrachten Sie die folgenden C 11-Codebeispiele:

Erstes Beispiel:

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

std::vector<int> &&rval_ref = return_vector();

Zweitens Beispiel:

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

std::vector<int> &&rval_ref = return_vector();

Drittes Beispiel:

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

std::vector<int> &&rval_ref = return_vector();

Erklärung

Erstes Beispiel:

  • Der Rückgabetyp ist eine L-Wert-Referenz std::vector&.
  • tmp ist eine lokale Variable und daher ein temporärer R-Wert.
  • Der temporäre tmp wird durch Kopieren zurückgegeben, daher ist keine Verschiebungssemantik beteiligt.
  • rval_ref wird zu einer nicht konstanten L-Wert-Referenz auf den zurückgegebenen Wert vector.

Zweites Beispiel:

  • Der Rückgabetyp ist eine R-Wert-Referenz std::vector&&.
  • tmp ist immer noch vorübergehend rvalue.
  • std::move(tmp) zwingt die Funktion, den temporären rvalue durch Verschieben statt durch Kopieren zurückzugeben.
  • Das bedeutet, dass tmp in den Rückgabewert verschoben wird und jetzt rval_ref enthält eine gültige R-Wert-Referenz.

Drittens Beispiel:

  • Dieses Beispiel ähnelt dem ersten.
  • Der Rückgabetyp ist eine lvalue-Referenz std::vector&, trotz std:: move(tmp).
  • std::move(tmp) ist unnötig und hat hier keinen Zweck Kontext.
  • Der temporäre tmp wird durch Kopie zurückgegeben und rval_ref wird zu einer nicht konstanten L-Wert-Referenz auf den zurückgegebenen Vektor.

Best Practice

Die empfohlene Methode Um ein temporäres Objekt als nur verschiebbare L-Wert-Referenz (z. B. std::vector&&) zurückzugeben, müssen Sie es einfach weglassen die Referenz und lässt den Compiler entscheiden, ob das Objekt basierend auf der Rückgabewertoptimierung (RVO) verschoben oder kopiert werden soll.

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

std::vector<int> rval_ref = return_vector();

Dieser Ansatz bietet die beste Kombination aus Leistung und Korrektheit.

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

Stellungnahme:
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