Rückgabe per R-Wert-Referenz: Ist das effizienter?
Die Rückgabe eines Objekts per R-Wert-Referenz ist möglicherweise nicht immer effizienter als die Rückgabe per L-Wert Referenz. Es kann zu baumelnden Referenzen führen, wenn es sich bei dem zurückgegebenen Objekt um ein temporäres Objekt handelt, das nach der Rückkehr der Funktion zerstört wird.
Der Originalcode:
Der bereitgestellte Codeausschnitt versucht zurückzukehren eine verschobene R-Wert-Referenz auf ein temporäres Beta_ab-Objekt:
Beta_ab&& Beta::toAB() const { return move(Beta_ab(1, 1)); }
Dies wird nicht empfohlen, da es eine fehlende Referenz zurückgibt. Um einen temporären Wert ordnungsgemäß in den Rückgabewert zu verschieben, sollte die Funktion einen Wert und keine R-Wert-Referenz zurückgeben:
Beta_ab Beta::toAB() const { return Beta_ab(1, 1); }
R-Wert-Referenzen mit anderen Funktionen verwenden:
Die Rückgabe einer R-Wert-Referenz kann in bestimmten Situationen von Vorteil sein. Wenn es beispielsweise eine getAB()-Funktion gibt, die häufig für temporäre Objekte aufgerufen wird, kann es effizienter sein, eine R-Wert-Referenz zurückzugeben:
struct Beta { Beta_ab ab; Beta_ab const& getAB() const& { return ab; } Beta_ab &&getAB() && { return move(ab); } };
In diesem Beispiel ist move erforderlich, da ab nicht erforderlich ist ein lokaler automatischer oder ein temporärer R-Wert. Der Ref-Qualifizierer && stellt sicher, dass die zweite getAB()-Funktion auf temporären R-Werten aufgerufen wird, was zu einer Verschiebung statt einer Kopie führt.
Schlussfolgerung:
Beim Zurückkehren by rvalue-Referenz kann in manchen Fällen effizient sein, sie sollte jedoch mit Vorsicht verwendet werden, um fehlende Referenzen zu vermeiden. Die Rückgabe eines Werts wird im Allgemeinen für Funktionen bevorzugt, die temporäre Objekte zurückgeben.
Das obige ist der detaillierte Inhalt vonIst die Rückgabe per R-Wert-Referenz immer effizienter als die Rückgabe per L-Wert-Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!