Frage Was ist der Unterschied zwischen einer tiefen Kopie und einer flachen Kopie?


Was ist der Unterschied zwischen einer tiefen Kopie und einer flachen Kopie?


755
2017-10-08 20:22


Ursprung


Antworten:


Flache Kopien werden so wenig wie möglich dupliziert. Eine flache Kopie einer Sammlung ist eine Kopie der Sammlungsstruktur, nicht die Elemente. Mit einer flachen Kopie teilen sich zwei Kollektionen nun die einzelnen Elemente.

Tiefe Kopien verdoppeln alles. Eine tiefe Kopie einer Sammlung besteht aus zwei Sammlungen, in denen alle Elemente der ursprünglichen Sammlung dupliziert sind.


592
2017-10-08 20:29



Breite vs. Tiefe; denken Sie an einen Referenzbaum mit Ihrem Objekt als Wurzelknoten.

Flach:

Before Copy Shallow Copying Shallow Done

Die Variablen A und B beziehen sich auf verschiedene Speicherbereiche. Wenn B A zugewiesen ist, beziehen sich die beiden Variablen auf den gleichen Speicherbereich. Spätere Änderungen an den Inhalten von beiden spiegeln sich sofort in den Inhalten anderer wider, da sie Inhalte teilen.

Tief:

Before Copy Deep Copying Deep Done

Die Variablen A und B beziehen sich auf unterschiedliche Speicherbereiche, wenn B dem A zugewiesen ist, werden die Werte in dem Speicherbereich, auf den A zeigt, in den Speicherbereich kopiert, auf den B zeigt. Spätere Änderungen am Inhalt von beiden bleiben einzigartig für A oder B; Der Inhalt wird nicht geteilt.


711
2017-10-08 20:39



Kurz gesagt, es hängt davon ab, was auf was zutrifft. In einer flachen Kopie zeigt Objekt B auf die Position von Objekt A im Speicher. Bei der Tiefenkopie werden alle Objekte in der Speicherstelle von Objekt A in die Speicherstelle von Objekt B kopiert.

Dieser Wiki-Artikel hat ein großartiges Diagramm.

http://en.wikipedia.org/wiki/Object_copy


135
2017-10-08 20:24



Besonders für iOS-Entwickler: 

Ob B ist ein flache Kopie von A, dann für primitive Daten ist es wie B = [A assign]; und für Objekte ist es wie B = [A retain];

B und A zeigen auf denselben Speicherort

Ob B ist ein tiefe Kopie von ADann ist es so B = [A copy];

B und A zeigen auf verschiedene Speicherplätze

Die B-Speicheradresse ist die gleiche wie die von A

B hat den gleichen Inhalt wie A


68
2018-01-23 11:43



Flache Kopie: Kopiert die Elementwerte von einem Objekt in ein anderes.

Deep Copy: Kopiert die Elementwerte von einem Objekt in ein anderes.
Alle Zeigerobjekte werden dupliziert und tief kopiert.

Beispiel:

class String
{
     int   size;
     char* data;
};

String  s1("Ace");   // s1.size = 3 s1.data=0x0000F000

String  s2 = shallowCopy(s1);
 // s2.size =3 s2.data = 0X0000F000
String  s3 = deepCopy(s1);
 // s3.size =3 s3.data = 0x0000F00F
 //                      (With Ace copied to this location.)

54
2017-10-08 20:25



Versuchen Sie folgendes Bild zu betrachten

enter image description here

Beispielsweise Object.MemberwiseClone erstellt ein flach Kopieren Verknüpfung

und verwenden ICloneable Schnittstelle, die Sie bekommen können tief Kopieren Sie wie beschrieben Hier


51
2018-06-15 08:42



Ich habe hier keine kurze, leicht verständliche Antwort gesehen - also werde ich es versuchen.

Bei einer flachen Kopie wird auf jedes Objekt, auf das die Quelle zeigt, ebenfalls durch das Ziel verwiesen (so dass keine referenzierten Objekte kopiert werden).

Bei einer tiefen Kopie wird jedes Objekt, auf das von der Quelle verwiesen wird, kopiert, und auf die Kopie wird vom Ziel verwiesen (es wird nun 2 von jedem referenzierten Objekt geben). Dadurch wird der Objektbaum zurückgespielt.


40
2017-10-08 20:36



{Stellen Sie sich zwei Objekte vor: A und B desselben Typs _t (in Bezug auf C ++) und Sie denken über seichtes / tiefes Kopieren von A nach B nach}

Flache Kopie: Erstellt einfach eine Kopie der Referenz auf A in B. Denken Sie darüber nach, wie eine Kopie von A's Adresse ist. Somit sind die Adressen von A und B dieselben, d. H. Sie zeigen auf denselben Speicherplatz, d. H. Dateninhalte.

Tiefe Kopie: Erstellt einfach eine Kopie aller Mitglieder von A, ordnet Speicher an einem anderen Ort für B zu und weist dann die kopierten Mitglieder B zu, um eine Tiefenkopie zu erreichen. Wenn A nicht existiert, ist auf diese Weise B immer noch im Speicher gültig. Der richtige zu verwendende Begriff wäre das Klonen, bei dem Sie wissen, dass beide vollständig identisch sind, aber dennoch unterschiedlich (d. H. Gespeichert als zwei verschiedene Entitäten im Speicherbereich). Sie können auch Ihren Klon-Wrapper angeben, in dem Sie über die Einschluss- / Ausschlussliste entscheiden können, welche Eigenschaften während der Tiefenkopie ausgewählt werden sollen. Dies ist eine gängige Praxis, wenn Sie APIs erstellen.

Sie können eine flache Kopie auswählen NUR WENN Sie verstehen, was auf dem Spiel steht. Wenn Sie eine enorme Anzahl von Zeigern haben, mit denen Sie in C ++ oder C umgehen können, sollten Sie eine flache Kopie eines Objekts erstellen JA WIRKLICH eine schlechte Idee.

BEISPIEL_OF_DEEP COPY_ Ein Beispiel ist, wenn Sie versuchen, Bildverarbeitung und Objekterkennung durchzuführen, müssen Sie "Irrelevante und sich wiederholende Bewegung" aus Ihren Verarbeitungsbereichen maskieren. Wenn Sie Bildzeiger verwenden, verfügen Sie möglicherweise über die Spezifikation zum Speichern dieser Maskenbilder. JETZT ... wenn Sie eine flache Kopie des Bildes machen, wenn die Zeigerreferenzen vom Stapel gelöscht werden, haben Sie die Referenz und ihre Kopie verloren, d. H. Es wird irgendwann einen Laufzeitfehler der Zugriffsverletzung geben. In diesem Fall benötigen Sie eine tiefe Kopie Ihres Bildes, indem Sie es KLONEN. Auf diese Weise können Sie die Masken abrufen, falls Sie sie in Zukunft benötigen.

EXAMPLE_OF_SHALLOW_COPY Ich bin nicht sehr kenntnisreich im Vergleich zu den Benutzern in StackOverflow, also zögern Sie nicht, diesen Teil zu löschen und ein gutes Beispiel zu setzen, wenn Sie klären können. Aber ich denke wirklich, es ist keine gute Idee, seichte Kopien zu machen, wenn Sie wissen, dass Ihr Programm für eine unendliche Zeitspanne laufen wird, d. H. Kontinuierliche "Push-Pop" -Operation über den Stapel mit Funktionsaufrufen. Wenn Sie etwas für einen Amateur oder eine Anfänger Person demonstrieren (z. B. C / C ++ Tutorial Zeug), dann ist es wahrscheinlich in Ordnung. Wenn Sie jedoch eine Anwendung wie Überwachungs- und Erkennungssystem oder Sonar-Tracking-System ausführen, sollten Sie Ihre Objekte nicht oberflächlich kopieren, da dies Ihr Programm früher oder später zerstören wird.


32
2018-01-31 23:39



Nur zum besseren Verständnis können Sie diesem Artikel folgen: https://www.cs.utexas.edu/~scottm/cs307/handouts/deepCopying.htm


Flache Kopie:

Shallow Copy 


Tiefe Kopie:

Deep Copy


28
2018-03-19 06:15



char * Source = "Hello, world.";

char * ShallowCopy = Source;    

char * DeepCopy = new char(strlen(Source)+1);
strcpy(DeepCopy,Source);        

'ShallowCopy' verweist auf denselben Speicherort wie 'Source'. "DeepCopy" zeigt auf einen anderen Speicherort im Speicher, aber der Inhalt ist derselbe.


27
2017-10-08 20:32



Was ist eine flache Kopie?

Shallow Copy ist eine bitweise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine genaue Kopie der Werte im ursprünglichen Objekt enthält. Wenn eines der Felder des Objekts Verweise auf andere Objekte sind, werden nur die Referenzadressen kopiert, d.h. nur die Speicheradresse wird kopiert. Shallow Copy

In dieser Figur ist die MainObject1 hat Felder field1 vom Typ int, und ContainObject1 vom Typ ContainObject. Wenn Sie eine flache Kopie von MainObject1, MainObject2 wird mit erstellt field2 enthält den kopierten Wert von field1 und zeigt immer noch auf ContainObject1 selbst. Beachten Sie, dass seit field1 ist vom primitiven Typ, dessen Wert kopiert wird field2 aber seit ContainedObject1 ist ein Objekt, MainObject2 zeigt immer noch auf ContainObject1. Also alle Änderungen an gemacht ContainObject1 im MainObject1 wird in reflektiert werden MainObject2.

Nun, wenn das eine seichte Kopie ist, lasst uns sehen, was Deep Copy ist?

Was ist Deep Copy?

Eine tiefe Kopie kopiert alle Felder und erstellt Kopien des dynamisch zugewiesenen Speichers, auf den die Felder verweisen. Eine tiefe Kopie tritt auf, wenn ein Objekt zusammen mit den Objekten kopiert wird, auf die es sich bezieht. Deep Copy

In dieser Abbildung hat das MainObject1 Felder field1 vom Typ int, und ContainObject1 vom Typ ContainObject. Wenn Sie eine tiefe Kopie von MainObject1, MainObject2 wird mit erstellt field2 enthält den kopierten Wert von field1 und ContainObject2 enthält den kopierten Wert von ContainObject1. Notieren Sie alle vorgenommenen Änderungen ContainObject1 im MainObject1 wird sich nicht widerspiegeln MainObject2.

guter Artikel


18
2017-12-18 06:55