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?
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.
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:
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.
Der Autor argumentiert, dass das if (this != &rhs) Prüfung ist überflüssig, weil:
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.
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.
Der Autor kommt zu dem Schluss, dass:
Kopieren und Nachbedingungen für Zuweisung verschieben:
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!