c 11 Rückgabewertoptimierung oder Verschiebung?
Beim Umgang mit Objekten mit Bewegungssemantik fragen sich Programmierer möglicherweise, ob sie explizit std verwenden sollen: :move oder verlassen Sie sich darauf, dass der Compiler die Rückgabewertoptimierung (RVO) durchführt. In Fällen wie diesen:
using SerialBuffer = vector< unsigned char >; // let compiler optimize it SerialBuffer read( size_t size ) const { SerialBuffer buffer( size ); read( begin( buffer ), end( buffer ) ); // Return Value Optimization return buffer; } // explicit move SerialBuffer read( size_t size ) const { SerialBuffer buffer( size ); read( begin( buffer ), end( buffer ) ); return move( buffer ); }
Welcher Ansatz ist vorzuziehen?
Die Antwort ist klar: Verwenden Sie immer die erste Methode. Der Compiler ist bereits in der Lage, die Rückgabe zu optimieren, und die explizite Verwendung von std::move stört diese Optimierung tatsächlich.
Copy-Elision ermöglicht die Verwendung des Move-Konstruktors bei der Rückgabe einer R-Wert-Referenz auf eine lokal definierte Variable . Indem Sie das Ergebnis explizit verschieben, verhindern Sie, dass der Compiler diese Optimierung für Sie durchführt.
Für eine optimale Leistung bleiben Sie daher ausschließlich bei der ersten Methode ohne die explizite Verschiebung. Überlassen Sie die Optimierung dem Compiler, da dieser garantiert den effizientesten Code erzeugt.
Das obige ist der detaillierte Inhalt vonC 11: RVO oder explizites „std::move' für Rückgabewerte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!