Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Verschiebesemantik

Das Kopieren-und-Vertauschen-Idiom verwenden

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Weiterentwicklung des einfachen Zuweisungsoperators vereinfacht den Austausch von Objekten, weil keine zusätzliche Kopie nötig wird, sondern lediglich die Verschiebungen erfolgen.
05:33

Transkript

Es gibt noch eine Optimierung, die wir hier bereitstellen können. Diese bezieht sich auf die Nicht-Verschiebungsversion des Zuweisungsoperators. Es handelt sich um das sogenannte Kopieren-und-Vertauschen-Idiom, "copy-and-swap idiom". Hier habe ich eine Arbeitskopie der Übungsdatei rational-03.cpp. Das Kopieren-und-Vertauschen- Idiom verwendet die vorhandenen Kopierkonstruktor- und Destruktormethoden einer Klasse, um zusätzliche Effizienz für den Kopierzuweisungsoperator bereitzustellen. Zum Beispiel schreibe ich hier in unserer main-Funktion die Anweisung "d = b". Wenn ich das Projekt nun erstelle und ausführe, ruft es den Zuweisungsoperator auf. Um nun Kopieren und Vertauschen zu implementieren, müssen wir zuerst eine swap-Methode für unsere Klasse erzeugen. Ich gehe also hier zurück in die Klasse. Und unmittelbar hier nach "reset" schreibe ich "void swap", unseren Klassennamen, ein "&" und "other". Wie Sie sehen ist das eine Referenz. Dann gehe ich hier nach unten zu "reset" und füge die Definition der Methode "swap" ein. Der Code für "swap" ist einfach. Er verwendet die Standardmethode "swap" und vertauscht unsere beiden Datenelemente, den Nenner und den Zähler. Das ist schon alles. Nun gibt es eine funktionierende swap-Methode. Wir können jetzt unseren vorhandenen Zuweisungsoperator verwenden, um damit das Kopieren-und- Vertauschen-Idiom zu erzeugen. Und das sieht so aus. Ich entferne dieses "const" und nehme diese Referenz weg. Außerdem nenne ich das Objekt in diesem Fall "other". Und die Meldung lautet nun "copy and swap". Diesen Code hier brauchen wir nun nicht mehr. Stattdessen brauchen wir nur dies zu schreiben. Und auch hier oben in der Deklaration werde ich es ändern. Somit ist die Methode ordnungsgemäß deklariert. Und hier ist unser Kopieren und Vertauschen. Als Erstes fällt auf, dass wir keine Referenz mehr übergeben. Folglich wird beim Aufruf dieser Methode der Parameter kopiert. Dies ruft den Kopierkonstruktor auf dem neuen temporären Objekt auf. Es ist tatsächlich effizienter, eine Kopie als Wert zu übergeben als im Rumpf der Methode ein temporäres Objekt zu erzeugen, weil der Compiler dann Optimierungen darauf vornehmen kann. Wir verwenden nun das temporäre Objekt und führen eine Vertauschung auf ihm aus. Es wird automatisch zerstört, sobald es den Gültigkeitsbereich verlässt. Das Ganze ist also unglaublich einfach und effizient. Wenn ich nun dieses Projekt erstelle und starte, ist zu sehen, dass unsere Zuweisung jetzt die Kopieren-und- Vertauschen-Funktion aufruft. Der interessante Teil ist aber hier zu finden. Mit dem Kopieren-und-Vertauschen-Konzept ist eigentlich kein separater Verschiebungs- Zuweisungsoperator mehr erforderlich. Somit kann ich diesen ganzen Code über Bord werfen, und ich zeige hier, was ich meine. Ich erzeuge zwei Objekte. a wird zu Fünf über Drei. Und b wird zu Neun über Fünf. Dann verschiebe ich a nach b. Nun gebe ich die Werte noch aus. Hier ist nun zu sehen, dass der überladene Operator "=" mehrdeutig ist, und zwar deshalb, weil wir ihn sowohl im Kopieren-und-Vertauschen als auch im Verschiebungs- Zuweisungsoperator haben. Wenn nämlich der Compiler diese Konstruktion hier ohne die Referenz sieht, wird er tatsächlich eine Verschiebung ausführen. Dabei wird ein R-Wert übernommen. Wenn ich also dies lösche und auch diesen Code hier entferne, wird unsere Mehrdeutigkeit aufgelöst. Sie sehen hier, dass das Kopieren undvVertauschen aufgerufen wurde. Außerdem ist zu sehen, dass ein Verschiebekonstruktor anstelle eines Kopierkonstruktors verwendet wird. Und weil wir einen R-Wert-Verweis haben, Wo ist er? Hier ist er. wird dieser nicht zur Kopie sondern zum eigentlichen R-Wert. Somit wird einfach diese Vertauschung ausgeführt und der andere Wert zurückgegeben. Und somit haben wir letztlich eine Verschiebung statt einer Kopie. Also findet bei dem einen Kopieren und Verschieben entweder ein Verschieben oder ein Kopieren statt. Wenn ich also dies hier herausnehme und einfach "a" schreibe, wird a nun nicht mehr leer zurückbleiben, sondern eine Kopie sein. Und b wird eine Kopie von a sein. Dies ist folglich eine bemerkenswert effiziente und effektive Lösung. Nun haben Sie sowohl Kopier- als auch Verschiebungs- Zuweisungsoperatoren in einer Implementierung, und sie ist kürzer und effizienter als die äquivalente getrennte Version. Das Kopieren und Vertauschen ist ein großartiges Beispiel für die Verschiebesemantik, um effizienten Code in unserer Klasse zu erzeugen.

C++: Verschiebesemantik

Verstehen Sie die grundlegenden Konzepte und sehen Sie, wie Verschiebesemantik in der modernen C++Entwicklung funktioniert.

30 min (9 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:27.12.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!