Dieses Problem scheint zu implizieren, dass es sich nur um ein Implementierungsdetail handelt ( memcpy
vs ???), aber ich kann keine explizite Beschreibung der Unterschiede finden.
127
Dieses Problem scheint zu implizieren, dass es sich nur um ein Implementierungsdetail handelt ( memcpy
vs ???), aber ich kann keine explizite Beschreibung der Unterschiede finden.
Antworten:
Clone
ist für beliebige Duplikate ausgelegt: EineClone
Implementierung für einen TypT
kann beliebig komplizierte Operationen ausführen, die zum Erstellen eines neuen erforderlich sindT
. Es ist ein normales Merkmal (außer im Vorspiel) und erfordert daher die Verwendung wie ein normales Merkmal mit Methodenaufrufen usw.Das
Copy
Merkmal stellt Werte dar, die sicher dupliziert werden können übermemcpy
: Dinge wie Neuzuweisungen und das Übergeben eines Argument-By-Value an eine Funktion sind immermemcpy
s, und daherCopy
versteht der Compiler für Typen, dass er diese nicht als Verschiebung betrachten muss .quelle
Clone
es sich um eine Tiefenkopie undCopy
eine Schattenkopie handelt?Clone
eröffnet die Möglichkeit, dass der Typ entweder eine tiefe oder eine flache Kopie erstellt: "willkürlich kompliziert".Der Hauptunterschied besteht darin, dass das Klonen explizit ist. Implizite Notation bedeutet Verschieben für einen Nicht-
Copy
Typ.Übrigens muss auch jeder
Copy
Typ seinClone
. Sie müssen jedoch nicht dasselbe tun!.clone()
Kann für Ihre eigenen Typen eine beliebige Methode Ihrer Wahl sein, während implizites Kopieren immer einememcpy
und nicht dieclone(&self)
Implementierung auslöst .quelle
y
einen Umzug erhaltenx
, keine Kopie davon, wie in Ihrem letzten auskommentierten Beispielw = v
. Wie würden Sie das spezifizieren?Copy
es für "billige" Typen implementiert werden soll, wieu8
im Beispiel. Wenn Sie einen ziemlich schweren Typ schreiben, für den Sie glauben, dass ein Zug effizienter ist als eine Kopie, lassen Sie ihn nicht implizierenCopy
. Beachten Sie, dass Sie im U8-Fall mit einem Umzug möglicherweise nicht effizienter sein können, da unter der Haube wahrscheinlich zumindest eine Zeigerkopie erforderlich ist - die bereits so teuer ist wie eine U8-Kopie. Warum also die Mühe machen?Copy
Merkmals einen Einfluss auf den impliziten Lebensbereich von Variablen hat? Wenn ja, finde ich das bemerkenswert.Wie bereits von anderen Antworten abgedeckt:
Copy
ist implizit, kostengünstig und kann nicht erneut implementiert werden (memcpy).Clone
ist explizit, kann teuer sein und kann willkürlich neu implementiert werden.Was manchmal in der Diskussion von
Copy
vs fehlt,Clone
ist, dass es auch beeinflusst, wie der Compiler Moves vs automatische Kopien verwendet. Zum Beispiel:Das erste Beispiel (
PointCloneAndCopy
) funktioniert hier aufgrund der impliziten Kopie einwandfrei, aber das zweite Beispiel (PointCloneOnly
) würde bei einer Verwendung nach dem Verschieben einen Fehler verursachen:Um die implizite Verschiebung zu vermeiden, könnten wir explizit aufrufen
let p2 = p1.clone();
.Dies kann die Frage aufwerfen, wie eine Bewegung eines Typs erzwungen werden kann, der das Merkmal Kopieren implementiert. . Kurze Antwort: Sie können / machen keinen Sinn.
quelle