В чем разница между глубокой и мелкой копиями?

Если вы используете клиент оболочки, такой как TortoiseSVN, щелкните правой кнопкой мыши «разрешить использование моего», как упоминает @Adi.

В командной строке это

svn resolve --accept mine-full <FILENAME>
754
задан Dariusz Woźniak 20 February 2014 в 22:45
поделиться

8 ответов

Мелкие копии копируют как можно меньше. Мелкая копия набора является копией структуры набора, не элементами. С мелкой копией два набора теперь совместно используют отдельные элементы.

Глубокие копии копируют все. Глубокая копия набора является двумя наборами со всеми элементами в исходном дублированном наборе.

683
ответ дан S.Lott 20 February 2014 в 22:45
поделиться

Мелкий copy:  Копирует членские значения с одного объекта в другого.

Глубокий Copy:        Копирует членские значения с одного объекта в другого.
                                          Любые объекты указателя дублированы и Глубоко Скопированы.

Пример:

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.)
59
ответ дан Martin York 20 February 2014 в 22:45
поделиться

Ширина по сравнению с Глубиной; думайте с точки зрения дерева ссылок с Вашим объектом как корневой узел.

Мелкий:

Before Copy Shallow Copying Shallow Done

переменные A и B относятся к различным областям памяти, когда B присвоен, эти две переменные относятся к той же области памяти. Более поздние модификации к содержанию любого немедленно отражаются в содержании другого, поскольку они совместно используют содержание.

Глубоко:

Before Copy Deep Copying Deep Done

переменные A и B относятся к различным областям памяти, когда B присвоен значения в области памяти, которая точки к копируются в область памяти, на которую указывает B. Более поздние модификации к содержанию или остаются уникальными для A или B; содержание не совместно используется.

781
ответ дан dlamblin 20 February 2014 в 22:45
поделиться

В объектно-ориентированном программировании тип включает набор членских полей. Эти поля могут быть сохранены или значением или ссылкой (т.е. указатель на значение).

В мелкой копии, новый экземпляр типа создается, и значения копируются в новый экземпляр. Ссылочные указатели также копируются точно так же, как значения. Поэтому ссылки указывают на исходные объекты. Любые изменения в участниках, которые хранятся ссылкой, появляются и в оригинале и в копии, так как никакая копия не была сделана из ссылочного объекта.

В глубокой копии, поля, которые хранятся значением, копируются как прежде, но указатели на объекты, хранившие ссылкой, не копируются. Вместо этого глубокая копия сделана из ссылочного объекта, и указатель на новый объект хранится. Любые изменения, которые внесены в те ссылочные объекты, не будут влиять на другие копии объекта.

16
ответ дан Jeffrey L Whitledge 20 February 2014 в 22:45
поделиться

Я не видел короткое, легкое для понимания ответа здесь - таким образом, я дам ему попытку.

С мелкой копией, на любой объект, на который указывает источник, также указывает место назначения (так, чтобы никакие ссылочные объекты не были скопированы).

С глубокой копией, любой объект, на который указывает источник, копируется, и на копию указывает место назначения (таким образом, теперь будет 2 из каждого ссылочного объекта). Это рекурсивно вызывает вниз дерево объектов.

46
ответ дан Bill K 20 February 2014 в 22:45
поделиться

Короче говоря, это зависит от какой точки к какой. В мелкой копии возразите, что B указывает для возражения местоположению A в памяти. В глубокой копии все вещи в объектной ячейке памяти A копируются для возражения ячейке памяти B.

Эта статья Wiki имеет большую схему.

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

147
ответ дан Ray Vega 20 February 2014 в 22:45
поделиться
char * Source = "Hello, world.";

char * ShallowCopy = Source;    

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

'ShallowCopy' указывает на то же местоположение в памяти, как 'Источник' делает '. DeepCopy' указывает на различное местоположение в памяти, но содержание является тем же.

31
ответ дан John Dibling 20 February 2014 в 22:45
поделиться
var source = { firstName="Jane", lastname="Jones" };
var shallow = ShallowCopyOf(source);
var deep = DeepCopyOf(source);
source.lastName = "Smith";
WriteLine(source.lastName); // prints Smith
WriteLine(shallow.lastName); // prints Smith
WriteLine(deep.lastName); // prints Jones
8
ответ дан Dour High Arch 20 February 2014 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: