2015-11-16 8 views
12

Nach this über die Copy-and-Swap-Idiom Lesen ich this gelesen habe, die unter (2) sagt:Wann ist copy-and-Swap-Idiom nicht anwendbar

class_name & class_name :: operator= (const class_name &)  (2)  

(2) Typische Erklärung ein Kopierzuweisungsoperators, wenn copy-and-Swap-Idiom nicht

verwendet wird wann sollten wir mit dem copy-and-Swap-Idiom zu vermeiden?

Und wenn es überhaupt „kann nicht verwendet werden“?

Gibt es wirklichen Leben Fälle, in denen beide Copy-and-Swap und Regel-of-Null nicht anwendbar sind?

Ich fand diese question aber es war zu spezifisch und enthielt keine Richtlinie, wie solche Fälle zu identifizieren sind.

+0

Normalerweise ist Copy-and-Swap * einfach * und * sicher *, aber aus Geschwindigkeitsgründen vielleicht nicht optimal. Wenn Sie zum Beispiel zwei Container mit einer Million Elementen zuweisen, ist es wahrscheinlich schneller, eine Million Aufgaben zu erledigen, als eine Million Konstruktionen und eine Million Zerstörungen durchzuführen. –

+3

@ user2079303 danke, dieser Satz war betrunken, er musste nach Hause gehen. Hoffnung jetzt ist es klarer – Darius

+1

Fälle des wirklichen Lebens, in denen Kopie/Austausch Ihre Leistung tötet: http://stackoverflow.com/a/25942402/576911 –

Antwort

7

Wann sollten wir vermeiden, das Copy-and-Swap-Idiom zu verwenden?

Wenn Sie beweisen können, dass naive Kopie sicher und schneller ist als swap.

Sie können den Fall identifizieren, wenn es keine Mitglied Zeiger (weder klug noch roh) sind, dass die eigenen Objekte und gleiches ist für alle Mitglieder Objekte wahr.

Und wenn es überhaupt nicht verwendet werden kann?

Kopieren und Tauschen kann nicht verwendet werden, wenn der Typ nicht swappable ist.

Um austauschbar zu sein, muss der Typ entweder move-constructible und move-assignable sein, oder Sie müssen eine swap Member-Funktion oder eine Friend-Funktion definiert haben.

2

Ihr Link die möglichen Implementierungen eines Zuweisungsoperators beschreiben beschrieben class_name& class_name::operator=(class_name) als:

Typische Deklaration einer Kopie Zuweisungsoperator, wenn copy-and-Swap-Idiom kann

Und class_name& class_name::operator=(const class_name&) verwendet werden, wie :

Typische Deklaration eines Kopierzuweisungsoperators, wenn Copy-and-Swap-Idiom nicht verwendet werden kann

Grundsätzlich würden wir immer wollen copy-and-Swap, wenn möglich verwenden, wie sie in den excellent answer to your linked question erwähnt, weil es die Selbstzuordnung Test bestehen wird.

So, jetzt ist die Frage, warum die Konvention über http://www.cppreference.com erwähnt?

Angenommen, ich implementiere einen Kopierkonstruktor in eine virtuelle Klasse und möchte jedem, der erbt, klar machen, dass er das Copy-and-Swap-Idiom verwenden soll. Wie würde ich das tun?Ich konnte ihnen helfen, indem sie die Kopie für sie in dem ersten Aufruf zu tun:

class_name& class_name::operator=(class_name) 

Dies ist eine Kopie von Wert ist, so dass die Implementierer von untergeordneten Klassen sehen würde, dass ich schon die Kopie für sie gemacht, so dass alle Sie müssen nur tauschen.

Nun, was wäre, wenn ich eine class_name hätte, die ein Mitglied enthielt, das nicht kopiert werden konnte, zum Beispiel was, wenn meine Klasse eine unique_ptr hat, so dass es nicht kopiert werden kann.

class_name& class_name::operator(const class_name&) 

Anzeige es wird auf Implementierer von untergeordneten Klassen, um sicherzustellen, dass eine ausreichende Prüfung erfolgt passieren die Selbst: Ich kann durch nicht Erstellen einer Kopie von Wert Argument für den Zuweisungsoperator, beispielsweise zeigen, dass -Zuweisungstest.

Verwandte Themen