Frage

Angenommen, ich habe den folgenden Code:

class some_class{};

some_class some_function()
{
    return some_class();
}

Das scheint ziemlich gut zu funktionieren und erspart mir die Mühe, eine Variable zu deklarieren, die nur einen Rückgabewert zu machen. Aber ich glaube nicht, dass ich jemals in irgendeiner Art Tutorial oder Referenz gesehen habe. Ist das eine Compiler-spezifische Sache (Visual C ++)? Oder ist das etwas falsch zu machen?

War es hilfreich?

Lösung

Nein, das ist völlig in Ordnung. Dies wird auch effizienter sein als der Compiler tatsächlich in der Lage ist, die vorübergehend zu optimieren weg.

Andere Tipps

Rückkehr Objekte aus einem Funktionsaufruf ist die „Factory“, Design, Muster und verwendet wird extensiv.

Allerdings sollten Sie vorsichtig sein, ob Sie Objekte zurückgeben, oder Zeiger auf Objekte. Der ehemalige davon führt Sie Konstrukteurs / Zuweisungsoperatoren zu kopieren, was ein Schmerz sein kann.

Es ist gültig, aber die Leistung kann nicht ideal sein, je nachdem, wie es genannt wird.

Zum Beispiel:

A a;
a = fn();

und

A a = fn();

ist nicht das gleiche.

Im ersten Fall wird der Standard-Konstruktor aufgerufen wird, und dann wird der Zuweisungsoperator angerufen auf einem, die eine temporäre Variable erfordert, aufgebaut werden.

Im zweiten Fall des Kopierkonstruktor verwendet wird.

Ein intelligent genug Compiler herausfinden, was Optimierungen möglich sind. Aber, wenn die Kopierkonstruktor Benutzer geliefert wird, dann sehe ich nicht, wie der Compiler die temporären Variable optimieren kann. Es muss den Kopierkonstruktor aufzurufen, und zu tun, dass es eine andere Instanz haben muss.

Der Unterschied zwischen Rob Walker Beispiel Rückgabewert Optimierung (RVO) aufgerufen, wenn Sie es googeln wollen.

Übrigens, wenn Sie Ihr Objekt enure auf die effizienteste Art und Weise zurückgeführt wird, erstellen Sie das Objekt auf dem Heap (dh über neu) einen shared_ptr mit und zurück statt einen shared_ptr. Der Zeiger wird zurückgegeben und Referenz zählt richtig.

Das ist absolut vernünftig C ++.

Das ist vollkommen legal C ++ und jeder Compiler sollte es akzeptieren. Was macht Sie glauben, es könnte etwas falsch machen?

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 sie es eher temporäre Objekte erstellt machen neigen haben, aber das ist, wie gut die Compiler abhängen können, Dinge optimieren.

Weitere Schwergewichts-Klassen, die Sie sicherstellen mögen, nicht kopiert werden (zum Beispiel sagen, ein großes Bitmap-Bild), dann ist es eine gute Idee Sachen zu passieren, wie die um als Bezugsgröße, die dann ausgefüllt werden, nur um sicherzustellen, absolut sicher, dass es keine temporären Objekte werden erstellt.

Insgesamt kann es vorkommen, dass Syntax vereinfachen und die Dinge direkt drehte einen Nebeneffekt der Schaffung von mehr temporäre Objekte in Ausdrücken haben kann, nur etwas, das man im Auge behalten sollte, wenn die Schnittstellen für mehr Schwergewichts-Objekte zu entwerfen.

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