2016-03-23 6 views
4

Wir alle wissen, dassFührt die Einführung einer neuen Variablen zur Optimierung der Rückgabewerte?

Foo returnAFoo() 
{ 
    return Foo(); 
} 

wird mit Rückgabewert Optimierung kompiliert werden, so wird ein Wert Kopie nicht, selbst wenn der Copykonstruktor von Foo hat Nebenwirkungen eingenommen werden. Aber wird

Foo returnAFoo() 
{ 
    Foo f = Foo(); 
    return f; 
} 

auch? Das zweite Konstrukt kann beim Debuggen hilfreich sein. Aber werfe ich dabei eine wichtige Optimierung weg? Vielleicht muss ich einen expliziten Move-Konstruktor schreiben?

+1

Hinweis: Es gibt eine spezifische Variante der Rückgabewertoptimierung namens * Named * Return Value Optimization (NRVO). Es ist manchmal schwieriger als "normale" RVO, aber im Allgemeinen können Compiler es tun. Beide unterscheiden sich vollständig vom Bewegen eines Objekts. Wenn Sie einen expliziten Kopierkonstruktor/Zuweisungsoperator haben, müssen Sie auch den Verschiebungskonstruktor/Zuweisungsoperator explizit definieren. – BoBTFish

+0

@BoBTFish: Bitte stellen Sie das als Antwort: Ich würde es akzeptieren. –

+1

http://cpp.sh/9yvs –

Antwort

7

Nein. Kopieren Elision kann hier noch angewendet werden. In diesem speziellen Fall heißt es NRVO (benannte Rückgabewertoptimierung). Sie benötigen keinen Verschiebungskonstruktor, damit die Kopie ausgeführt werden kann. copy elision ist seit C++ 98/03 im Standard, als wir nur Kopierkonstruktoren hatten.

Um die Wahrscheinlichkeit zu erhöhen, dass die Kopierfunktion verwendet wird, sollten Sie sicherstellen, dass entweder alle Codepfade das gleiche Objekt (NRVO) zurückgeben oder alle Codepfade ein temporäres Objekt (RVO) zurückgeben.

Wenn Sie NRVO und RVO innerhalb der gleichen Funktion mischen und zuordnen, wird es schwierig, die Optimierung anzuwenden.


Sample code demonstriert NRVO.