C++: Verschiebesemantik

Weiterführende Betrachtungen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Bei Einsatz der Verschiebesemantik sind ein paar wichtige Überlegungen zu berücksichtigen, die sich vor allem um const-Werte und nicht immer automatisch erfolgende Fehlerüberprüfungen drehen. Leider lässt sich eben nicht alles verschieben!
03:33

Transkript

Es gibt eine Reihe von Dingen, die Sie berücksichtigen müssen, wenn Sie Verschiebesemantik in Ihren Klassen implementieren. Die Dreierregel ist in C++ eine allgemein anerkannte Regel, die besagt: Wenn Sie eine dieser drei Memberfunktionen in Ihrer Klasse definieren Destruktor, Kopierkonstruktor oder Kopier-Zuweisungsoperator, müssen Sie alle drei definieren. Natürlich generiert der Compiler für alle diese Memberfunktionen eine Standardversion. Doch wenn Sie schon eine von ihnen definieren müssen, dürften die Standardversionen wahrscheinlich nicht für alle drei genügen. Wenn Sie eine dieser Funktionen definieren, liegt es nahe, dass Sie Daten verwalten. Somit sind die Standardversionen, irgendwelcher dieser Funktionen, höchstwahrscheinlich nicht in der Lage, ordnungsgemäß mit den Daten umzugehen. Mit Verschiebesemantik wird die Dreierregel zur Fünferregel. Die Argumentation ist die gleiche, nur mit den zusätzlichen Verschiebeversionen von Konstruktor und Zuweisungsoperator. Wenn Sie das Kopieren-und- Vertauschen-Konzept realisieren, dann werden sowohl Kopierzuweisung als auch Verschiebezuweisung durch ein und dieselbe Memberfunktion behandelt. Manche Leute scherzen dann auch, dass die Fünferregel zur Viererregel oder Viereinhalbregel wird, doch ist das nicht allzu verbreitet. Tatsächlich stellt nämlich das Objekt bei dem Kopieren-und- Vertauschen-Zuweisungsoperator trotzdem beide Funktionen bereit. Wenn Sie mit Verschiebesemantik arbeiten, müssen Sie verstehen, wo Verschiebeoperationen angewendet und nicht angewendet werden können. Ich habe hier eine Arbeitskopie der Übungsdatei rational-04.cpp. Ich gehe hier im main-Rumpf nach unten, lösche das alles und lege ein einfaches Beispiel an. Als Erstes definiere ich eine rationale Zahl: "Rational (5,3)". Das ist die rationale Zahl a. Nun noch eine rationale Zahl b. Und wir verschieben a nach b. Anschließend geben wir beide rationalen Zahlen aus. Ich erstelle und starte nun das Projekt. Wie Sie sehen, wird ein Verschiebekonstruktor aufgerufen, weil wir a nach b verschieben. Am Ende ist a leer, b enthält Fünf über Drei. Und wir rufen am Ende des Gültigkeitsbereichs die Destruktoren auf. Der erste wichtige Einspruch lautet, dass man ein als "const" qualifiziertes Objekt nicht verschieben kann. Und wenn ich dies mit "const" qualifiziere, das Projekt erstelle und starte, werden Sie sehen, dass ich jetzt den Kopierkonstruktor bekomme. Leider ist es kein Fehler, ein als "const" qualifiziertes Objekt verschieben zu wollen. Was passiert? Wie Sie wissen ist diese Verschiebung lediglich eine Typumwandlung. Und somit wird dies zu einem R-Wert. Doch in diesem Fall entsteht ein const-qualifizierter R-Wert, der sich immer noch nicht verschieben lässt. Der Compiler wählt daraufhin einfach den besten Konstruktor aus, der in diesem Fall der Kopierkonstruktor sein wird. Und stillschweigend versieht er seinen Job. Denken Sie also immer daran, dass Sie ein als "const"qualifiziertes Objekt nicht verschieben können. Und "move" ist keine Funktion, sondern eine Typumwandlung, sodass sie keine Fehlerprüfung ausführt. Somit tut der Compiler stillschweigend das Beste, was er kann, was normalerweise den Aufruf eines Kopierkonstruktors bedeutet. Vor allem aber, wird der Wert an sich nicht verschoben. Wie zu sehen ist, enthalten sowohl a als auch b Werte, wobei ohne dieses "const" die Verschiebekonstruktoren zum Zuge kommen und a wie erwartet geleert wird. Der Compiler liegt also im Allgemeinen richtig, wenn er die Zuweisungsmethode für den Konstruktor auswählt. Und er versucht, einen sinnvollen Weg einzuschlagen, doch dieser muss nicht unbedingt der sein, den Sie erwarten. Wichtig ist also, dass Sie Ihre Annahme testen und verstehen, dass sich nicht alles verschieben lässt.

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!