Frage

Wie gehen Sie mit der Rückgabewert Optimierung ?
Gibt es Fälle, in denen ich einem modernen Compiler vertrauen kann die Optimierung zu verwenden, oder soll ich immer den sicheren Weg gehen und einen Zeiger eines bestimmten Typs zurückgeben / eine Referenz als Parameter verwenden?

Gibt es bekannte Fälle, in denen der Rückgabewert Optimierung vorgenommen werden kann nicht ?, Mir scheint, dass der Rückgabewert Optimierung ziemlich einfach sein würde, für einen Compiler auszuführen.

War es hilfreich?

Lösung

Jedes Mal, wenn Compiler-Optimierungen aktiviert sind (und in den meisten Compiler, auch wenn Optimierungen deaktiviert ), wird RVO stattfinden. NRVO ist etwas weniger häufig, aber die meisten Compiler wird diese Optimierung durchführen als auch, zumindest, wenn Optimierungen aktiviert sind.

Du hast Recht, die Optimierung is ziemlich einfach für einen Compiler auszuführen, weshalb Compiler fast immer es tun. Die einzigen Fälle, in denen es „kann nicht gemacht werden,“ sind diejenigen, bei denen die Optimierung gilt nicht: RVO gilt nur, wenn Sie eine unbenannte temporäre zurückzukehren. Wenn Sie eine benannte lokale Variable zurückgeben möchten, NRVO gilt statt, und während es etwas komplexer ist für einen Compiler zu implementieren, ist es machbar, und moderne Compiler haben kein Problem damit.

Andere Tipps

die beste Chance haben, dass es auftritt, Sie ein Objekt zurückgeben kann direkt in der return-Anweisung [kann jemand erinnere sich an den Namen für dieses Idiom - ich habe vergessen, es] aufgebaut:

Foo f() {
    ....
    return Foo( ... );
}

Aber wie bei allen Optimierungen, kann der Compiler wählt immer, es nicht zu tun. Und am Ende des Tages, wenn Sie einen Wert dir zurückkehren müssen, ist keine Alternative, die Compiler zu vertrauen, -. Zeiger und Referenzen werden es nicht schneiden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top