Heim >Backend-Entwicklung >C++ >Ist die Prüfung „if (this != &rhs)' in einem Verschiebungszuweisungsoperator erforderlich?

Ist die Prüfung „if (this != &rhs)' in einem Verschiebungszuweisungsoperator erforderlich?

DDD
DDDOriginal
2024-11-28 00:33:11227Durchsuche

Is the `if (this != &rhs)` Check Necessary in a Move Assignment Operator?

Zuweisungsoperator verschieben und if (this != &rhs)

In standardmäßigen Kopierzuweisungsoperatoren für Klassen ist es üblich, zu überprüfen, ob das zugewiesene Objekt das ist Identisch mit dem aufrufenden Objekt, das if (this != &rhs) verwendet, um eine Änderung des aufrufenden Objekts zu vermeiden. Aber ist diese Prüfung für den Verschiebungszuweisungsoperator notwendig?

Bewegungssemantik

Der Verschiebungszuweisungsoperator, bezeichnet durch „operator=(Class&&),“ ist für die effiziente Übertragung des Eigentums an Ressourcen konzipiert von einem Objekt zum anderen. Im Gegensatz zur Kopierzuweisung entfällt die Notwendigkeit, eine neue Kopie des Objekts zu erstellen.

Situationsanalyse

Kann das == &rhs?

Es stellt sich die Frage, ob dies == &rhs jemals in einem Verschiebungszuweisungsoperator wahr sein kann.

Es gibt zwei Szenarien wenn ein Objekt an eine R-Wert-Referenz bindet:

  1. Es ist ein tatsächliches temporäres Objekt.
  2. Es ist ein Objekt, das der Aufrufer vorgibt, ein temporäres Objekt zu sein.

Im ersten Fall ist dies == &rhs unmöglich, da das Objekt eine eindeutige Referenz auf ein temporäres Objekt ist. Im zweiten Fall liegt es in der Verantwortung des Aufrufers, sicherzustellen, dass this != &rhs, wodurch die Prüfung unnötig wird.

Argument für die Nichtprüfung

Der Autor argumentiert, dass das if (this != &rhs) Prüfung ist überflüssig, weil:

  • Selbstzuweisung für Provisorien ist unmöglich.
  • Clients, die den Operator absichtlich täuschen, sollten ihren Code korrigieren.

Durch das Weglassen dieser Prüfung kann die Leistung in Situationen verbessert werden, in denen Objekte häufig von sich selbst verschoben und ihnen selbst zugewiesen werden.

Argument für die Überprüfung

Einige argumentieren jedoch, dass die Überprüfung dieses != &rhs immer noch notwendig ist Selbstbewegungszuweisung verhindern. Sie behaupten, dass das Zulassen von swap(x, x) als gültige Operation diese Prüfung auslösen könnte.

Lösung und Überlegungen

Der Autor kommt zu dem Schluss, dass:

Kopieren und Nachbedingungen für Zuweisung verschieben:

  • Kopieren Zuweisung: Der Wert von y sollte unverändert bleiben, auch im Fall der Selbstkopie-Zuweisung.
  • Zuweisung verschieben: y sollte einen gültigen, aber nicht spezifizierten Status haben, auch für sich selbst -Bewegungszuweisung.

Selbstbewegungszuweisung Implementierung:

Um dies zu erreichen, werden drei mögliche Implementierungen für den Verschiebungszuweisungsoperator in einer Klasse wie dumb_array bereitgestellt:

1. Eine Prüfung wird durchgeführt Unterscheiden Sie die Selbstbewegungszuweisung und setzen Sie das Objekt zuvor auf einen gültigen Zustand geht weiter.

2. Das Einchecken entfällt, wodurch die Selbstbewegungszuweisung zu einem No-Op wird.

3. Der Tausch (andere )-Methode wird verwendet, sofern die Klasse keine Ressourcen enthält, die sofort freigegeben werden sollten.

Der Autor betont, dass die beste Implementierung vom spezifischen Klassendesign, den Hardwareeigenschaften und den Leistungsanforderungen abhängt.

In Fällen, in denen die Klasse den Speicher nicht direkt verwaltet, empfiehlt er die Verwendung von „operator=(Class& &) = Standard; um die höchste Leistung mit grundlegender Ausnahmesicherheit zu erreichen.

Das obige ist der detaillierte Inhalt vonIst die Prüfung „if (this != &rhs)' in einem Verschiebungszuweisungsoperator erforderlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn