754 votes

Quelle est la différence entre une copie profonde et une copie superficielle ?

Quelle est la différence entre une copie profonde et une copie superficielle ?

6 votes

De quelle technologie relève-t-il ?

42 votes

@SureshVarma, c'est un concept de programmation !

927voto

dlamblin Points 14546

Étendue et profondeur ; pensez en termes d'arbre de références avec votre objet comme nœud racine.

Peu profond :

Before CopyShallow CopyingShallow Done

Les variables A et B font référence à différentes zones de la mémoire, lorsque B est assigné à A, les deux variables font référence à la même zone de la mémoire. Les modifications ultérieures du contenu de l'une sont instantanément répercutées sur le contenu de l'autre, car elles partagent le même contenu.

Profondément :

Before CopyDeep CopyingDeep Done

Les variables A et B font référence à des zones de mémoire différentes, lorsque B est assigné à A, les valeurs de la zone de mémoire vers laquelle pointe A sont copiées dans la zone de mémoire vers laquelle pointe B. Les modifications ultérieures du contenu de l'une ou l'autre variable restent propres à A ou à B ; le contenu n'est pas partagé.

38 votes

Voici l'article de wikipedia dont est tirée cette illustration, au cas où elle n'aurait pas de sens pour vous hors contexte. fr.wikipedia.org/wiki/Object_copy#Shallow_copy

4 votes

Dans le cas d'une copie superficielle, si nous faisons des changements dans le tableau B, cela sera-t-il reflété dans le tableau A puisque A et B pointent tous deux vers le même emplacement mémoire ?

1 votes

Une copie superficielle signifie donc que seule une référence à l'entité originale est disponible pour la soi-disant copie. Toute modification apportée à l'entité originale sera reproduite dans la nouvelle entité ? La copie profonde clonerait l'entité originale et en ferait une nouvelle copie sans rapport.

849voto

S.Lott Points 207588

Les copies superficielles dupliquent le moins possible. Une copie superficielle d'une collection est une copie de la structure de la collection, pas des éléments. Avec une copie superficielle, deux collections partagent maintenant les éléments individuels.

Les copies profondes dupliquent tout. Une copie profonde d'une collection est constituée de deux collections dont tous les éléments de la collection originale sont dupliqués.

0 votes

Il se peut que l'implémentation de MemberwiseClone() de .NET fasse plus que de la copie superficielle au sens conventionnel.

9 votes

N'oubliez pas qu'il y a aussi copies mélangées (non seulement comme copie paresseuse ), qui en duplique une partie seulement ( voici un exemple ) ! ;)

0 votes

Ainsi, une copie superficielle de X peut changer les éléments de X, mais pas une copie profonde ?

167voto

helloandre Points 5784

En bref, cela dépend de ce qui pointe vers quoi. Dans une copie superficielle, l'objet B pointe vers l'emplacement de l'objet A en mémoire. Dans une copie profonde, tout ce qui se trouve dans l'emplacement mémoire de l'objet A est copié dans l'emplacement mémoire de l'objet B.

Cet article du wiki contient un excellent diagramme.

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

70voto

Abhishek Bedi Points 967

Spécialement pour les développeurs iOS :

Si B est un copie superficielle de A alors pour les données primitives, c'est comme suit B = [A assign]; et pour les objets, c'est comme B = [A retain] ;

B et A pointent vers le même emplacement mémoire

Si B est un copie profonde de A alors c'est comme B = [A copy];

B et A pointent vers des emplacements mémoire différents

L'adresse mémoire de B est la même que celle de A

B a le même contenu que celui de A

8 votes

"L'adresse mémoire de B est la même que celle de A" - Comment cela se fait-il ?

2 votes

Dans Deep Copy, "l'adresse mémoire de B n'est PAS la même que celle de A".

64voto

Loki Astari Points 116129

Copie superficielle : Copie les valeurs des membres d'un objet dans un autre.

Copie profonde :    Copie les valeurs des membres d'un objet dans un autre.
                     Tous les objets pointeurs sont dupliqués et copiés en profondeur.

Exemple :

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.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X