C++: Verschiebesemantik

std::move verwenden

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das in der STL enthaltene Funktions-Template zur Verschiebung von Objekten ähnelt eher einer Casting-Funktion.
05:01

Transkript

Die C++-Bibliothek bietet ein Funktionstemplate namens move. Nun gut, das standardmäßige move arbeitet tatsächlich eher wie eine Typumwandlung. Damit weist man den Compiler an, ein Objekt zu verwenden als wäre es ein R-Wert. Es wird also verschiebbar gemacht. Ich habe hier eine Arbeitskopie der Datei vector-test-01.cpp, die einige interessante Dinge enthält. Es gibt eine einfache Message-Funktion, um eine Meldung auf dem Bildschirm anzuzeigen. Es gibt eine Display-Vector-Funktion, um Vektoren anzuzeigen. Hier definiere ich die Vektoren v1 und v2. Dann rufe ich die Message auf, die v1 ausgibt. Anschließend zeige ich den Vektor v1 an, gebe die Meldung "v2" aus und zeige den Vektor v2 an. Wenn ich das Projekt erstelle und ausführe, sehen Sie hier in meiner Konsole die Vektorgröße. Und dann wird der Vektor angezeigt. "one", "two", "three", "four", "five". Somit ist v1 gleich "one", "two", "three", "four", "five", und v2 ist "six", "seven", "eight", "nine", "ten". Das ist hier wichtig, weil wir damit ein wenig herumspielen. So kann ich zum Beispiel v1 nach v2 verschieben. Das kann ich wie folgt bewerkstelligen. Ich schreibe: v2 ist gleich "std::move" v1. Diese Anweisung verwendet dieses move-Funktionstemplate, das wirklich mehr ist als lediglich eine Typumwandlung, die lediglich besagt: Es ist in Ordnung, dies zu verschieben. Das funktioniert nur, wenn ein Wert in einen R-Wert umwandelbar ist, was in diesem Fall auf v1 zutrifft. Auf der anderen Seite des Gleichheitszeichens muss das Element, das zu verschieben ist, eine Verschiebungskopie unterstützen. Das ist bei v2 der Fall. Wir kopieren den ganzen Anzeigecode hier nach unten, sodass wir sehen können, wie es vor und nach der Verschiebung aussieht. Vor der Verschiebung sehen wir, dass v1 fünf Elemente enthält: "one", "two", "three", "four", "five". In v2 sind auch fünf Elemente enthalten: "six", "seven", "eight", "nine", "ten". Nach der Verschiebung ist v1 leer, und v2 besitzt den Inhalt, der vorher in v1 war. Somit ist der Inhalt von v1 verschoben worden, ohne dass irgendetwas kopiert würde, und zwar verschoben worden über v2. Und v1 bleibt leer zurück, ohne irgendwelchen Inhalt. Hätte ich diese Verschiebung hier nicht verwendet und einfach gesagt, v2 ist gleich v1, würde der Vektor kopiert werden. Wenn ich das Projekt erstelle und ausführe, können Sie sehen, dass beide Vektoren nun identisch sind und sämtliche Daten kopiert wurden. Mit der Verschiebung jedoch bleibt v1 leer zurück, in v2 steht der Inhalt von v1, und es hat kein Kopieren stattgefunden. Man kann dieses "std::move" auch verwenden, um eine swap-Funktion zu erstellen. Ich würde sie hier einfügen, und zwar als Funktionstemplate. Ich schreibe das hier lieber aus, anstatt den Shortcut zu verwenden. Mit unserer Message-Funktion zeigen wir an, dass wir uns in der Funktion befinden. Ich schreibe "swap", und dann führen wir die Verschiebung aus. Wir erzeugen ein temporäres Objekt und verschieben den Inhalt von a in dieses temporäre Objekt. Dann verschieben wir b nach a, und verschieben den temporären Wert zurück nach b. Das temporäre Objekt wird natürlich zerstört, wenn es den Gültigkeitsbereich verlässt. Und wir haben nun eine swap-Funktion. Somit kann ich hier anstelle dieses "std::move" sagen: "swap". Das hier brauche ich nicht. Vielmehr kann ich jetzt "swap", "v1", "v2" schreiben. Wenn ich das Projekt erstelle und ausführe, sehen Sie, dass v1 nun die Elemente "six", "seven", "eight", "nine", "ten" enthält und v2 jetzt "one", "two", "three", "four", "five" beinhaltet. Dies ist ohne jegliches Kopieren erreicht worden, nur, indem diese Elemente herumgeschaufelt wurden, durch Verschieben ohne zu kopieren. Sie sehen hier die Meldung "swap", und zwar deshalb, weil das Programm tatsächlich meine swap-Funktion aufruft. Auch im Namespace "standard" gibt es eine swap-Funktion, die zur Standardbibliothek gehört. Wenn ich also hier schreibe "std", und das Projekt erstelle und ausführe, erhalten wir das gleiche Ergebnis: "six", "seven", "eight", "nine", "ten" in v1, und "one", "two", "three", "four", "five" in v2. Doch wir sehen nicht die Meldung "swap", weil wir nicht unsere swap-Funktion im Main-Namespace aufrufen. Vielmehr rufen wir standardmäßige swap-Funktionen im Standard-Namespace auf. Ich wollte nur zeigen, wie es mit den Verschiebungen bewerkstelligt wird, und außerdem, wie einfach sich das Gleiche mit einem Funktionstemplate realisieren lässt, und dass keinerlei Kopieren stattfindet. Alles wird per Verschiebesemantik abgewickelt. Somit sind die standardmäßigen move- und swap-Templates fundamentale Instrumente für die Verwendung mit Verschiebesemantik. Sie werden sie oftmals verwenden, wenn Sie mit Verschiebesemantik im Rest dieses Kurses arbeiten, und natürlich in Ihrem eigenen Code.

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!