Heim > Backend-Entwicklung > C++ > Wie können C 11-Rvalue-Referenzen und Move-Semantik Vektorrückgabewerte optimieren?

Wie können C 11-Rvalue-Referenzen und Move-Semantik Vektorrückgabewerte optimieren?

Barbara Streisand
Freigeben: 2024-12-23 17:51:13
Original
813 Leute haben es durchsucht

How Can C  11 Rvalue References and Move Semantics Optimize Vector Return Values?

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

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

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

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

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

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!

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