Inhaltsverzeichnis

Move-Konstruction

Nehmen wir ein Array, dass einen Wert zuweisen soll.

array += Data( 4711 );

Die Data-Klasse wird eventuell sehr aufwendig erzeugt. Hier ist std::move aus c++ schon sehr schön, aber vielleicht beinhaltet die Klasse noch viele weitere Zeiger etc, die alle einzeln kopiert werden müssen und das eventuell auch über eine ganze Reihe von Elementen.

Hier könnte man es so gestalten, dass intern nicht die Information übertragen wird, sondern die Adresse, wo die R-Value Inforamtion konstruiert wird. So wird immer nur ein Zeiger übergeben. Der Zeiger zeigt nun auf den Programmabschnitt von Data(4711), also die Initialisierung der Parameterliste und den Aufruf des Konstruktors. Der Konstruktor selbst sollte dann ein Placed-New sein. Beim Aufruf der Konstruktions-Funktion wird nun wieder eine Adresse übergeben, an der Placed-New das Data-Objekt konstruieren soll. So kann das Objekt trotz Funktionsübergabe, direkt in das Array erzeugt werden, obwohl beim Aufruf noch nicht bekannt ist, wo das Array das Element gerne unterbringen möchte.

movable

Movable Objekte können dadurch konstruiert werden, dass die zu verschiebenen Elemente Movable erklärt werden.

Bitmap contains
  Width is int move,
  Height is int move,
  bitmap is int ptr move,
  internal is int ptr;  // <- Objekt ist moveable, der Pointer wird nicht gemoved

Dadurch kann automatisch der richtige move-Konstruktor erzeugt werden.

Dadurch, dass der Move-Konstruktor nicht händisch erzeugt werden muss, aber alle movable Daten über das move-Attribut gekennzeichnet sind, kann zusätzlich ein dying-move-Konstruktor erzeugt werden und ein dying-destruktor.

dying move, dying destruktor

Dying Objekts sind Objekte, die nur dazu erzeugt wurden, um übergeben zu werden:

myBitmap : Bitmap( 100, 100, Color::White );

Das Objekt besitzt keinen Namen und stirbt mit der Benutzung. Im Gegensatz zu

temp is Bitmap( 100, 100, Color::White );
myBitmap : move temp;

temp : BitMap( 200, 200, Color::Black );

muss das gemovte Objekt (hier temp) in einem Zustand bleiben, der eine valide Zuweisung und Weiterverwendung ermöglicht.

Bei einer Zuweisung eines unbenannten Objektes oder eines Objektes, das nach der Zuweisung nicht mehr verwandt wird:

temp is Bitmap( 100, 100, Color::White );

return temp;

muss das Quellobjekt nicht mehr zu einem validen Zustand gebracht werden. Es kann direkt zerstört werden. Im Beispiel hier wird würde ein normaler Destruktor sich um die Member-Variablen 'bitmap' und 'internal' kümmern. Wenn bitmap jedoch weggemovt wurde, das Objekt aber nicht valide gesetzt wurde (der Pointer zeigt weiterhin auf die weggemovte Bitmap, statt beispielsweise auf Nullptr), dann wird auch 'bitmap' zerstört. Ein Dying Destruktor kann nun über das Attribut 'move' einen zweiten Destruktor bauen, der nur die Teile des Objektes freigibt, die nicht mit move gekennzeichnet sind. (und anschließend den dying destruktor der Basis aufrufen)