Angenommen, ich habe den folgenden Code:
%Vor%Das scheint ziemlich gut zu funktionieren und erspart mir die Mühe, eine Variable deklarieren zu müssen, nur um einen Rückgabewert zu erhalten. Aber ich glaube nicht, dass ich das in irgendeiner Art von Tutorial oder Referenz gesehen habe. Ist das eine Compiler-spezifische Sache (Visual C ++)? Oder macht das etwas falsch?
Nein, das ist vollkommen richtig. Dies wird auch effizienter sein, da der Compiler tatsächlich in der Lage ist, das Temporäre zu optimieren.
Das Zurückgeben von Objekten aus einem Funktionsaufruf ist das Entwurfsmuster "Factory" und wird häufig verwendet.
Sie sollten jedoch vorsichtig sein, ob Sie Objekte oder Zeiger auf Objekte zurückgeben. Der erste von diesen wird Sie dazu bringen, Konstruktoren / Zuweisungsoperatoren zu kopieren, was ein Schmerz sein kann.
Es ist gültig, aber die Leistung ist möglicherweise nicht ideal, je nachdem, wie es aufgerufen wird.
Zum Beispiel:
%Vor%und
%Vor%sind nicht gleich.
Im ersten Fall wird der Standardkonstruktor aufgerufen, und dann wird der Zuweisungsoperator auf einem aufgerufen, der die Erstellung einer temporären Variablen erfordert.
Im zweiten Fall wird der Kopierkonstruktor verwendet.
Ein intelligent genug Compiler wird herausfinden, welche Optimierungen möglich sind. Aber wenn der Kopierkonstruktor vom Benutzer bereitgestellt wird, sehe ich nicht, wie der Compiler die temporäre Variable optimieren kann. Es muss den Kopierkonstruktor aufrufen, und dazu muss es eine andere Instanz haben.
Der Unterschied zwischen Rob Walker's Beispiel heißt Return Value Optimization (RVO), wenn Sie danach googlen wollen.
Wenn Sie übrigens sicherstellen möchten, dass Ihr Objekt am effizientesten zurückgegeben wird, erstellen Sie das Objekt auf dem Heap (dh über new) mit einem shared_ptr und geben Sie stattdessen shared_ptr zurück. Der Zeiger wird zurückgegeben und die Referenz zählt korrekt.
Dies ist absolut legal C ++ und jeder Compiler sollte es akzeptieren. Was lässt dich denken, dass es etwas falsch machen könnte?
Das ist der beste Weg, es zu tun, wenn Ihre Klasse ziemlich leicht ist - ich meine, dass es nicht sehr teuer ist, eine Kopie davon zu machen.
Ein Nebeneffekt dieser Methode ist jedoch, dass es eher dazu führt, dass temporäre Objekte erstellt werden, obwohl das davon abhängen kann, wie gut der Compiler Dinge optimieren kann.
Für schwerere Klassen, die nicht kopiert werden sollen (zB ein großes Bitmap-Bild), ist es eine gute Idee, solche Sachen als Referenzparameter zu übergeben, die dann ausgefüllt werden absolut sicher, dass keine temporären Objekte erstellt werden.
Insgesamt kann es passieren, dass die Vereinfachung der Syntax und die direktere Gestaltung der Dinge einen Nebeneffekt der Erstellung von mehr temporären Objekten in Ausdrücken haben, was Sie beim Entwerfen der Schnittstellen für schwerere Objekte beachten sollten.
Tags und Links c++ constructor visual-c++ oop