In letzter Zeit habe ich aufgrund meiner Arbeit viel Material über C++-Rechtswerte gelesen. In C++ ist right-valued ein sehr wichtiges Konzept, das für das Verständnis der internen Mechanismen von C++ und die Implementierung von effizientem Code entscheidend ist. In diesem Artikel werde ich 10 praktische Lektionen über rechte Werte zusammenfassen.
- Es gibt zwei Arten von C++-Rechtswerten: reine Rechtswerte und Will-be-dead-Werte. Right-Value-Referenzen verlängern den Lebenszyklus eines Will-be-dead-Wertes, so dass der Will-be-dead-Wert normal verwendet und nicht versehentlich freigegeben werden kann.
- Eine Auswirkung von Rechtswert-Referenzen ist die Verlängerung des Lebenszyklus von Rechtswerten. Eine Referenz auf einen rechten Wert verlängert den Lebenszyklus eines toten Wertes, so dass der tote Wert normal verwendet und nicht versehentlich freigegeben werden kann.
- Temporäre Objekte werden wie rechte Werte behandelt. Solche Objekte werden oft automatisch in einem Ausdruck erstellt und dann sofort verwendet. Die Verwendung von rechtswertigen Referenzen zum Binden von temporären Objekten ermöglicht es dem Programm, diese Objekte effizienter zu behandeln und unnötige Speicherkopiervorgänge zu vermeiden.
- Move-Konstruktoren binden rechtswertige Nicht-Konstanten so weit wie möglich. Das liegt daran, dass rechtswertige Nichtkonstanten geändert werden können, rechtswertige Konstanten hingegen nicht. Der move-Konstruktor zerstört das Quellobjekt, so dass nur rechtswertige Nichtkonstanten durch den move-Konstruktor gebunden werden können.
- Für ein rechtswertiges Objekt sind Aufrufe von Mitgliedsfunktionen erlaubt. Dies ist ähnlich wie bei linkswertigen Objekten. Beachten Sie jedoch, dass bei einem sterbenden Wert der Aufruf seiner Mitgliedsfunktion zu einem undefinierten Verhalten im Programm führen kann, wenn er sich am Ende seines Lebenszyklus befindet.
- Rechte Werte können geändert werden (was auch bedeutet, dass sie zerstört werden können). Daher müssen rechte Werte mit Vorsicht behandelt werden, um Probleme mit dem Programm zu vermeiden, weil sie verändert wurden.
- Rechte Werte können nicht als linke Werte verwendet werden; linke Werte können als rechte Werte verwendet werden. Das liegt daran, dass ein linker Wert eine tatsächliche Adresse hat und sich genauso verhält wie ein rechter Wert.
- Konstante Links-Wert-Referenzen können an Rechts-Werte gebunden werden. Eine solche Referenz vermeidet das Risiko, das Objekt mit dem rechten Wert zu verändern, und verlängert außerdem den Lebenszyklus des Objekts mit dem rechten Wert, so dass es normal verwendet werden kann.
- Funktionen, die rechtswertige Referenzen zurückgeben, sind in fast allen Fällen schlecht. Das liegt daran, dass die Rückgabe einer rechtswertigen Referenz dazu führt, dass der Lebenszyklus des rechtswertigen Objekts verlängert wird, so dass es falsch verwendet werden kann. Für Funktionen, die rechtswertige Referenzen zurückgeben, wird empfohlen, eine Wertrückgabe zu verwenden.
- In den meisten Fällen macht die Verwendung von is std::move in return die Sache nicht besser, sondern verhindert, dass der Compiler eine Optimierung des Rückgabewerts durchführt.