2013-10-08 2 views
0

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

+1

он делает только мелкую копию, вложенные фрагменты не копируются –

ответ

1

Храбровый урод прав, это мелкая копия. Вы можете увидеть источник для функции dup в dmd2/src/druntime/src/rt/lifetime.d. Функция называется _adDupT.

Это довольно короткая функция, где основной работой является вызов memcpy(). Над функцией вы можете увидеть представление массива: struct {size_t length; void * ptr; }

Невыровненный массив будет массив массивов, так что память будет выглядеть [length0, ptr0, length1, ptr1, Length2, ptr2 ....]

Поскольку тетср над этими указателями не следуйте за ними, это означает, что slice.dup является мелкой копией.

Это, как правило, относится ко всему, что копирует ломтики, оно всегда мелкие копии, если вы ничего не делаете сами. Итак, структура A {char [] str; } A a, b; a = b; также будет мелкой копией, поэтому утвердите (a.str is b.str).

Если вы хотите сделать глубокую копию, самый простой способ это просто цикл над ним:

T[][] newArray; 
foreach(item; oldArray) 
     newArray ~= item.dup; 

(вы также можете preallocat newArray.length = oldArray.length и назначить с индексами, если вы хотите немного ускоряйте его)

Глубокая копия структуры может быть выполнена с отражением времени компиляции, хотя я предпочитаю писать метод клонирования или что-то там, потому что это немного более ясно.

Я не знаю о функции фобо с этой доработкой.