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?
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
@BoBTFish: Bitte stellen Sie das als Antwort: Ich würde es akzeptieren. –
http://cpp.sh/9yvs –