Wann ist eine flache Kopie wünschenswert (anstelle einer tiefen Kopie)?

8

Kann jemand ein Beispiel für eine Situation geben, in der eine flache Kopie benötigt wird?

Beachten Sie, dass in einigen Situationen seichte Kopie und tiefe Kopie identisch sind. Dies kann passieren, wenn das Objekt keine Eigentumsrechte an einer seiner Untervariablen besitzt. Das heißt, alle Untervariablen sind aggregiert . Ich würde gerne Beispiele sehen, wo ein Objekt aus Variablen zusammengesetzt ist, die es besitzt, und es ist immer noch wünschenswert zu kopieren sie flach.

Anmerkung : Es ist mir egal, in welcher Sprache die Beispiele angegeben sind. Ich stelle diese Frage aus Sicht von C ++ / Java / C #, obwohl ich denke, dass Kopieren ein sprachunabhängiges Konzept ist.

    
Dimitri C. 28.07.2010, 08:13
quelle

9 Antworten

8

Wenn die eigenen Variablen unveränderliche Typen sind, ist eine flache Kopie ausreichend. Eine tiefe Kopie ist möglich, würde aber nur zu zusätzlicher Speicherbenutzung führen.

    
Niels van der Rest 28.07.2010 09:08
quelle
4

Ein möglicher Anwendungsfall ist, wenn die zusammengesetzten Objekte aus Zustandsinformationen abgeleitet werden können, die in der flachen Kopie vorhanden sind, und Sie beispielsweise Ihr Objekt serialisieren möchten.

Sie können die flache Kopie speichern und dann das vollständige Objekt nach der Deserialisierung aus dem Status wiederherstellen.

    
Vinko Vrsalovic 28.07.2010 08:20
quelle
4

Aus C ++ - POV kommend würde es ein Szenario geben, in dem ich eine seichte Kopie verwenden werde: bei der Implementierung des Copy-on-Write-Mechanismus.

    
YeenFei 28.07.2010 08:23
quelle
3
%Vor%

Sie möchten, dass alle Änderungen von Example.elementList mit Objektmethoden durchgeführt werden, Sie aber die in der Liste gespeicherten Elemente verfügbar machen möchten. So erstellen Sie Getter, die eine flache Kopie zurückgibt. Kopieren, weil Sie nicht möchten, dass der Aufrufer die Liste des Objekts ändert, und seicht, weil Sie Objekte aus der Liste und nicht ihre Kopien anzeigen möchten.

    
Tadeusz Kopec 28.07.2010 09:43
quelle
3

Wenn Sie sich die Designmuster der Gang of Four anschauen, gibt es ein Muster namens FlyWeight . Hier ist ein Zitat aus Wikipedia:

  

Ein Fliegengewicht ist ein Objekt, das   minimiert den Speicherverbrauch durch Teilen als   viel Daten wie möglich mit anderen   ähnliche Objekte; es ist ein Weg zu benutzen   Objekte in großen Zahlen, wenn eine einfache   wiederholte Darstellung würde ein verwenden   inakzeptable Menge an Speicher.

Dies wäre eine akzeptable Verwendung einer flachen Kopie.

    
Miguel Ping 28.07.2010 09:59
quelle
2

Wie ich in meiner Antwort auf Ihre Frage darauf hingewiesen habe, haben viele Sprachen nicht wirklich das Konzept der seichten und tiefen Kopie. Diese Klasse in C ++, die Sie daran hindert, einen NULL-Zeiger zu verwenden, kann jedoch ein Beispiel sein, bei dem eine "flache" Kopie benötigt wird:

%Vor%

Die Klasse besitzt nicht das Ding, auf das gezeigt wird, also sollte keine Kopie gemacht werden.

    
anon 28.07.2010 08:21
quelle
2

Ich nehme an, dass die Situationen, in denen Sie eine tiefe Kopie verwenden würden, für C ++ und Java anders sind.

  • In C ++ können Sie tiefes Kopieren verwenden, um schwierige Speicherverwaltungsprobleme zu vermeiden oder die Implementierung einer Multithread-Anwendung zu vereinfachen.

  • In Java ist ein tiefgreifendes Kopieren aus diesen Gründen nicht erforderlich. Da die Sprachen beide Garbage Collected sind, ist es nicht notwendig, durch Hoops zu freien Datenstrukturen zu gehen. Eine tiefe Kopie ist also nicht notwendig, um das Problem zu vereinfachen. Ähnlich hat Java eine integrierte Unterstützung für die Synchronisierung des Zugriffs durch mehrere Threads auf gemeinsam genutzte Datenstrukturen.

In den meisten Fällen ist tiefes Kopieren in Java nicht erforderlich, vorausgesetzt, die Datenstrukturen Ihrer Anwendung sind gut gestaltet.

    
Stephen C 28.07.2010 09:38
quelle
1

Flache Kopien sind schneller zu machen, was aus offensichtlichen Gründen oft wünschenswert ist. Das ultimative Flachkopieren ist offensichtlich nur eine Kopie einer Referenz auf das Originalobjekt. Wenn Sie ein Objekt nicht mutieren und sicherstellen können, dass es während der Arbeit nicht anders geändert wird, gilt: Je flacher die Kopie ist, desto besser.

    
Kylotan 28.07.2010 10:04
quelle
1
  

Bemerkung: Es ist mir egal, in welcher Sprache die Beispiele angegeben sind. Ich stelle diese Frage aus Sicht von C ++ / Java / C #, obwohl ich denke, dass Kopieren ein sprachunabhängiges Konzept ist.

Ich denke, es hängt ziemlich viel von der Sprache ab.

In C ++ spielt das Kopieren eine ganz andere Rolle als in Java / C #. In C ++ kann ich mir viele Fälle nicht vorstellen, in denen Flachkopieren sinnvoll ist. Sie würden stattdessen nur Referenzen oder Zeiger auf ein Objekt erstellen. Kopierkonstruktoren implementieren normalerweise tiefe Kopien, da in C ++ ein Objekt die Eigentümerschaft für seine Mitglieder übernimmt und für die Verwaltung ihrer Lebensdauer verantwortlich ist. Da es keine GC gibt, werden diese Besitz-Semantiken wichtig, und Sie können nicht einfach nur zwei Objekte auf eine dritte verweisen, ohne besondere Vorsicht (verwenden sie Referenzzählung, um die dritte am Leben zu halten? Wenn nicht, welches der beiden Objekte besitzt es?)

Ich würde sogar sagen, dass die Unterscheidung zwischen "tiefen" und "flachen" Kopien in C ++ nicht wirklich sinnvoll ist. Eine Kopie erstellt alles, was notwendig ist, damit das neu erstellte Objekt funktioniert. Manchmal teilt es ein bisschen mit Daten (normalerweise Daten, die keinem der beiden Objekte gehören), also ist es möglicherweise keine "echte" tiefe Kopie ", aber es ist auch nicht flach, weil es die Masse ist der Klasse wird normalerweise kopiert.

    
jalf 28.07.2010 13:01
quelle

Tags und Links