Stimmt etwas nicht mit dem Zurücksetzen von konstruierten Standardwerten?

Angenommen, ich habe den folgenden Code:

class some_class{};

some_class some_function()
{
    return some_class();
}

Dies 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?

0

6 Antworten

Es ist gültig, aber die Leistung ist möglicherweise nicht ideal, je nachdem, wie es aufgerufen wird.

Beispielsweise:

A a;
a = fn();

und

A a = fn();

sind nicht das Gleiche.

In the first case the default constructor is called, undthen the assignment operator is invoked on a which requires a temporary variable to be constructed.

Im zweiten Fall wird der Kopierkonstruktor verwendet.

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, undto do that it has to have another instance.

0
hinzugefügt
Der Standard erlaubt dem Compiler ausdrücklich, den Kopierkonstruktor zu verlassen.
hinzugefügt der Autor Daniel James, Quelle

Nein, das ist vollkommen richtig. Dies wird auch effizienter sein, da der Compiler tatsächlich in der Lage ist, das Temporäre zu optimieren.

0
hinzugefügt
Tatsächlich sind moderne Compiler oft in der Lage, eine benannte Variable, die zurückgegeben wird, zu opmazieren
hinzugefügt der Autor Nemanja Trifunovic, Quelle

Dies ist absolut legal C ++ und jeder Compiler sollte es akzeptieren. Was lässt dich denken, dass es etwas falsch machen könnte?

0
hinzugefügt
Es ist nur so, dass ich es nie irgendwo in meiner begrenzten Erfahrung mit C ++ gesehen habe.
hinzugefügt der Autor Jason Baker, Quelle
Meinetwegen. Verwenden Sie es definitiv, wenn es keinen Grund gibt, eine temporäre Variable zu verwenden, dann müssen Sie es nicht tun!
hinzugefügt der Autor Greg Hewgill, Quelle

Der Unterschied zwischen Rob Walker Beispiel heißt Return Value Optimization (RVO), wenn Sie dafür googeln möchten.

Wenn Sie 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 einen shared_ptr zurück. Der Zeiger wird zurückgegeben und die Referenz zählt korrekt.

0
hinzugefügt
Im Allgemeinen ist RVO effizienter als die Verwendung von shared_ptr, das Objekt wird auf dem Heap erstellt. Außerdem muss shared_ptr ein zusätzliches Objekt zum Speichern der Anzahl erstellen.
hinzugefügt der Autor Daniel James, Quelle

Das ist völlig in Ordnung C ++.

0
hinzugefügt

Das Zurückgeben von Objekten aus einem Funktionsaufruf ist das Entwurfsmuster "Factory" und wird weitgehend verwendet.

Sie sollten jedoch vorsichtig sein, ob Sie Objekte oder Zeiger auf Objekte zurückgeben. Der erste dieser Artikel wird Sie dazu bringen, Konstruktoren/Zuweisungsoperatoren zu kopieren, was sehr schmerzhaft sein kann.

0
hinzugefügt