Frage

Ich will ich sicherstellen, verstehen Pass-by-value vs Pass-by-reference richtig. Insbesondere betrachte ich den Präfix / postfix Versionen des Zuwachses ++ Operator für ein Objekt.

Nehmen wir an, wir haben die folgende Klasse X:

class X{
private:
    int i;
public:
 X(){i=0;}
 X& operator ++ (){ ++i; return *this; } //prefix increment

 X operator ++ (int unused){ //postfix increment
  X ret(*this);
  i++;
  return ret;
 }

 operator int(){ return i; } //int cast
};

Zunächst einmal habe ich implementiert, um den Präfix / postfix Zuwachs Operatoren richtig?

Zweitens, wie speichereffizient ist der Postfix-Operator, verglichen mit dem Präfix-Operator? Insbesondere, wie viele X Objektkopien erstellt werden, wenn jede Version des Betreibers verwendet wird?

Eine Erklärung, was genau passiert mit Rückkehr-by-reference vs Return-by-Wert helfen könnte, mich zu verstehen.


Edit: Zum Beispiel mit dem folgenden Code ...

X a;
X b=a++;

... sind und jetzt Aliase b?

War es hilfreich?

Lösung

Dies ist eine korrekte Umsetzung. Es ist typisch, dass ein Postfix-Operator schlechter auf die Leistung sein wird, weil Sie eine weitere Kopie erstellen, bevor die Schrittweite zu tun (und das ist, warum ich in die Gewohnheit, immer mit Präfix bekommen haben, wenn ich etwas anderes benötigen).

Mit Rück-by-reference, Sie Rückkehr einen l-Wert Verweis auf das aktuelle Objekt. Der Compiler würde dies in der Regel implementieren, indem Sie die Adresse des aktuellen Objekts zurück. Dies bedeutet, dass das Objekt zurückkehr so ??einfach ist eine Zahl als zurück.

Doch mit Rückkehr-by-Wert, eine Kopie muss getan werden. Das heißt, es weitere Informationen ist bei der Rückkehr zu kopieren über (statt nur einer Adresse) sowie eine Kopie Konstruktor aufzurufen. Dies ist, wo Ihre Leistung Hit kommt in.

Die Effizienz der Implementierung sieht auf Augenhöhe mit typischen Implementierungen.

EDIT: Im Hinblick auf Ihren Nachtrag, nein, sie sind Aliase nicht. Sie haben zwei separate Objekte erstellt. Wenn Sie zurückkommen nach Wert (und, wenn Sie aus dem Postfix Inkrementoperator ein neues Objekt erstellt) das neue Objekt wird in einer bestimmten Speicherstelle platziert.

Doch in dem folgenden Code, a und b sind Aliase:

 int a = 0;
 int& b = ++a;

b ist eine Adresse, welche Referenzen a.

Andere Tipps

Es ist mehr idiomatisches zu nennen den Präfix Schritt des Objekts selbst in dem postfix Schritt:

X operator++(int)
{
    X copy(*this);
    ++*this;         // call the prefix increment
    return copy;
}

Die Logik ein X Objekt des Inkrementierens somit ausschließlich innerhalb der Präfixversion enthalten ist.

sind Ihre Betreiber korrekt umgesetzt.

In dem Präfix-Operator, keine Kopien von X gemacht werden.

In der Postfix-Operator, ein Exemplar für ret gemacht, und möglicherweise eine weitere Kopie gemacht wird, wenn von der Funktion zurückkehrt, aber alle Compiler wird diese Kopie elide.

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