5. Все ли value type по умолчанию поддерживают copy-on-write?Теория

Темы

Компании

Ответ

Нет, copy-on-write не свойство всех value type.

Снаружи это всё равно value type: правка одной копии не меняет другую. Данные копируют не при присваивании, а в момент изменения, и только если ими ещё пользуется другая переменная.

По умолчанию механизм есть у таких типов:

  • Array, ContiguousArray, Dictionary, Set, String
  • ArraySlice, Substring
  • Data, AttributedString

Обычный struct копирует поля сразу. Copy-on-write у него нужно делать самому, т.е. class в куче и isKnownUniquelyReferenced перед записью.

Нет. Обычный struct при присваивании копирует свои поля. Copy-on-write у него сам не появляется. Его дают типы стандартной библиотеки с большим буфером: Array, Dictionary, Set, String. Свой тип получает такую семантику, только если её написать: хранить данные в классе-буфере и копировать буфер при записи, когда ссылка не единственная.

Поле-класс внутри структуры тоже не включает copy-on-write. Копируется ссылка, а объект остаётся общим, пока код сам не отделит копию.