Ist RVO (Return Value Optimization) gilt für alle Objekte?
Ist RVO (Return-Wert-Optimierung) garantiert und gilt für alle Objekte und Situationen in der C++ - Compiler (speziell GCC)?
Wenn die Antwort "Nein" ist, was sind die Bedingungen dieser Optimierung für eine Klasse/Objekt? Wie kann ich erzwingen oder anregen, dass der compiler einen RVO auf einen bestimmten Rückgabewert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Return-Wert-Optimierung kann immer angewendet werden, was nicht generell ist Namens Return-Wert-Optimierung. Grundsätzlich ist für die Optimierung stattfinden kann, muss der compiler wissen, welches Objekt zurückgegeben wird an der Stelle, wo das Objekt gebaut ist.
Im Falle der RVO (wo eine temporäre zurückgegeben wird), dass diese Bedingung trivial erfüllt sein: das Objekt ist konstruiert in der return-Anweisung, und ja, es ist zurückgegeben.
Im Falle der NRVO, Sie würde haben, den code zu analysieren, um zu verstehen, ob der compiler wissen kann, oder nicht, die Informationen. Wenn die Analyse der Funktion ist einfach, sind die Chancen, dass der compiler optimieren (eine einzige return-Anweisung, die nicht enthalten einen bedingten, zum Beispiel, mehrere return-Anweisungen mit dem gleichen Objekt; mehrere return-Anweisungen, wie
T f() { if (condition) { T r; return r; } else { T r2; return r2; } }
wo der compiler weiß, dassr
oderr2
wird zurückgegeben werden...)Beachten Sie, dass Sie nur annehmen, dass die Optimierung in einfachen Fällen, insbesondere das Beispiel in der wikipedia eigentlich könnte optimiert werden, indem eine smart genug compiler:
Umgeschrieben werden kann durch den compiler in:
Und der compiler wissen kann, in dieser Zeit, die in der ersten Verzweigung
a
konstruiert werden an Stelle des zurückgegebenen Objekts, und im zweiten Zweig das gleiche gilt fürb
. Aber ich würde mich nicht drauf verlassen. Wenn der code zu Komplex ist, davon ausgehen, dass der compiler nicht in der Lage sein zu produzieren die Optimierung.BEARBEITEN: Es ist ein Fall, dass ich nicht explizit erwähnt, der compiler ist nicht zulässig (in den meisten Fällen, auch wenn es erlaubt war, könnte es nicht vielleicht tun es) zur Optimierung entfernt die Kopie von einem argument der Funktion der return-Anweisung:
value
eine temporäre Wege des seins als Wert übergeben, und daher vollkommen berechtigt, für die RVO?Keine Optimierung ist immer garantiert (obwohl RVO ist Recht zuverlässig, es gibt Sie doch einige Fälle, die werfen es Weg).
Detail, die ganz bewusst abstrahiert von Ihnen.
Weder kennen noch sich dafür interessieren, bitte.
Jesper: wenn das Objekt gebaut werden können, ist groß, die Vermeidung der Kopie notwendig sein könnte (oder zumindest sehr wünschenswert).
Wenn RVO geschieht, die Kopie wird vermieden und Sie müssen nicht mehr schreiben, Zeilen code.
Wenn es nicht funktioniert, müssen Sie es manuell tun, schreiben extra Gerüst selbst. Und dies wird wahrscheinlich beinhalten die Bestimmung eines Puffer im Voraus, Sie zu zwingen, schreiben Sie einen Konstruktor für diese leere (wahrscheinlich ungültig ist, können Sie sehen, wie das ist nicht sauber) - Objekt und eine Methode zum 'construct' das ungültige Objekt.
So ‘kann Es reduzieren meine Zeilen code, wenn es garantiert. Ist es nicht?' bedeutet nicht, dass Masoud ist ein idiot. Leider für ihn jedoch RVO ist nicht garantiert. Sie haben, um zu testen, ob es passiert und wenn es nicht klappt, schreiben das Gerüst und verschmutzen Ihr design. Es kann nicht sein, herped.
R-Wert-Referenz (neues feature von C++11) ist eine Lösung für dein problem, die können Sie verwenden
Type(Type &&r);
(die move-Konstruktor) explizit, stattType(const Type &r)
(die copy-Konstruktor).Beispiel:
Haben und dieser nicht auslösen copy-Konstruktor.
EDIT1
Den code
gekürzt werden kann, um
Da ein temp-Objekt ist R-value-ref standardmäßig.
return
-ing ein Objekt machen würde, Sie konstruieren ein neues Objekt (entweder durch kopieren oder verschieben), nicht eine Referenz des temp-Objekt. Was Sie sagte, würde nur passieren, wenn der Rückgabetyp eine Referenz oder ein Zeiger.Habe ich nicht mit ja oder Nein zu beantworten, aber Sie sagen, dass können Sie schreiben weniger code-Zeilen, wenn die Optimierung, die Sie suchen, ist garantiert.
Wenn Sie den code schreiben, den Sie schreiben müssen, das Programm wird immer funktionieren, und ob die Optimierung da ist, wird es schneller arbeiten. Wenn es tatsächlich einen Fall, wo der Optimierung ", füllt die leere" in der Logik eher als die mechanik der code und macht es, oder man ändert die Logik, das scheint ein bug, ich würde wollen Feste eher als eine Implementierung detail, das ich wollen würde, zu verlassen oder zu verwerten.