2016-04-08 11 views
1

После просмотра build better apps with value type. В примере с фотошопом они произвели, что они сказали, чтоКак Swift реализовать поведение копирования Array в режиме записи?

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

Итак, я начинаю удивляться, как выглядят эти два массива в памяти. Поэтому я немного экспериментирую.

struct Test { 
    var i: Int 
    var j: Int 
} 

var valueArray = [Test(i: 1, j: 9), Test(i: 2, j: 7)] 
var valueArray2 = valueArray 

Когда я печатаю valueArray и адрес valueArray2, они не совпадают.
«Может быть, они реализуют это по указателю хранилища в массиве?»
Но когда я печатаю содержимое памяти с использованием lldb, они на самом деле всего 4 Int (1,9,2,7).
Так что я смущен, я еще не изменил массив. И, похоже, они делают копию целого массива? Так где я неправильно понял?
Функция, я использовал для печати адреса структуры, используя метод, предоставляемый @nschum в this question.

func address(o: UnsafePointer<Void>) { 
    let addr = unsafeBitCast(o, Int.self) 
    print(NSString(format: "%p", addr)) 
} 

Это не дублирует вопрос this question. Я спрашиваю о языковых перьях, а другой - о навыках программирования.

+0

новые вары действительно созданы, но внутреннее представление будет таким же и будет скопировано при записи внутри. У разработчиков нет доступа к внутренним деталям реализации типов значений. – Shripada

+0

Возможный дубликат [Как создать контейнер с семантикой copy-on-write? (Swift)] (http://stackoverflow.com/questions/32984258/how-can-i-make-a-container-with-copy-on-write-semantics-swift) –

+0

Это не дублирующий вопрос об этом вопрос. Я спрашиваю о языковых перьях, а другой - о навыках программирования. –

ответ

2

Хорошо, я много экспериментировал и, наконец, понял.

  1. Мы используем &, чтобы получить адрес массива, потому что когда мы делаем это, Swift будет копировать массив, чтобы лучше взаимодействовать с C, используйте адрес & ПОЛУЧИТЬ объекта, который примыкает к массиву и сделать математику вместо этого. Или использовать инструкцию lldb frame variable -L
  2. Весь массив скопирован после изменения любого из его значений.
  3. Элемент фактического значения массива выделяется в куче.
  4. Swift также сделал много оптимизации для Array, чей элемент является классом.
  5. Свифт является удивительным.

Я на самом деле пишу my first blog для этого.

+0

Мне кажется, что все ваши тесты проводятся на детской площадке, которая, насколько мне известно, интерпретируется. Так что это может измениться, как вещи хранятся в памяти. – Juangamnik

0

После ваших комментариев и получения лучшего понимания, если это, я загрузил его в игровую площадку, и, кажется, работает, как ожидалось

enter image description here

оригинальный ответ для справки

Вещь, которую следует помнить, заключается в том, что структуры - это в основном куски данных в памяти. Когда вы создаете значениеArray, ячейка памяти устанавливается в значение присвоено значение

Когда вы создаете valueArray2, вы создаете новый экземпляр структуры, что означает, что у него будет новый кусок памяти и вы устанавливаете значение этого нового фрагмента памяти на то же значение куска памяти из valueArray. Это приводит к копированию данных в двух разных ячейках памяти.

Это отличие от объекта, и в этом случае valueArray будет указателем на кусок памяти, а когда вы создадите valueArray2, он будет создавать новый указатель на тот же кусок памяти.

+0

Это то, что я знаю, я ожидаю некоторую оптимизацию, например, не копирование использования write. –

+0

Что вы ожидаете от их оптимизации? Точка использования типов значений заключается в том, что копии не связаны друг с другом каким-либо образом. Это требует, чтобы они находились в разных местах. – PeejWeej

+0

'Несколько копий массива используют одно и то же хранилище, если ни одна из копий не изменена. 'из [Структура структуры массива] (https://developer.apple.com/library/tvos/documentation/Swift/Reference/Swift_Array_Structure/index.html) –