2017-06-16 2 views
2

Ich habe kürzlich einen Artikel über die neue Bewegungssemantik in C++ gelesen. Es ging um die Verwirrung, wie man einen Rückgabewert für ein großes Objekt am besten implementiert. Die Schlussfolgerung war, implementieren Sie es einfach wie eine Kopie und lassen Sie den Compiler entscheiden, ob eine Bewegung am besten funktioniert.Sind konstante Referenzen in C++ 11 und später immer noch die beste Praxis?

Jetzt fragte ich mich, ob das auch für die Funktionsparameter gilt.

Derzeit verwende ich const Referenzen wie folgt aus:

void setLargeObject(const LargeObject &obj) { 
    _obj = obj; 
} 

Anstelle der einfachen Kopie:

void setLargeObject(LargeObject obj) { 
    _obj = obj; 
} 

sind Parameter, große Objekte zu kopieren, von const Verweis übergeben immer noch die beste Praxis in C++ 11 und später?

+0

Ich glaube schon, eine Referenz ist schwerelos im Vergleich zu einem großen Objekt. – Vivick

+1

Ich denke, es ist einfach für den Compiler zu wissen, dass der zurückgegebene Wert verschoben werden kann (insbesondere, wenn es eine lokale Variable ist, die den Gültigkeitsbereich verlässt). Ich denke nicht, dass es so einfach ist, das über Parameter zu wissen. – Steve

Antwort

2

Wenn für das Festlegen der Eigenschaft die Übernahme des Werts erforderlich ist, wird der Wert übergeben. Sie wird bei Bedarf vor dem Funktionsaufruf kopiert, wenn der Parameter initialisiert wird. Verschieben Sie sie innerhalb der Funktion an ihren Platz.

void setLargeObject(LargeObject obj) { 
    _obj = std::move(obj); 
} 

Wenn LargeObject unterstützt keine Bewegung Semantik (also mit std::move ändert sich nichts), dann könnten Sie const& verwenden, um die Leistungseinbußen auf eine Kopie anstelle von zwei zu begrenzen. Die beste Lösung ist jedoch, Beweglichkeit hinzuzufügen, nicht bei const& bleiben.

Verwandte Themen