Механизм Copy-on-Write

В этой статье рассмотрим механизм Copy-on-Write и когда его можно использовать. Ранее мы уже рассматривали Reference Type и Value Type. Так вот, Value Type имеют семантику копирования — это когда вы присваиваете или передаете в качестве параметра функции экземпляр типа Value Type, то данные этого экземпляра будут скопированы. В итоге получится два одинаковых экземпляра, но с разными адресами в памяти.

Но не все так просто. С точки зрения производительности, если при передаче параметра в функцию типа Value Type этот параметр всегда бы копировался, то такая операция была бы очень дорогой. Пытаясь оптимизировать затраты на такую операцию в Swift механизм Copy-on-Write применяется только к коллекциям и только при мутации такого объекта. (и только если на такой объект имеется более одной ссылки, иначе объект можно было бы просто изменить по ссылке и никакое копирование бы не требовалось). Что это значит? — что при присвоении переменной значений или при передаче коллекции в функцию необязательно произойдет копирование этой коллекции.

Давайте посмотрим простой пример:

// 1
func print(address obj: UnsafeRawPointer ) {
    print(String(format: "%p", Int(bitPattern: obj)))
}

// 2
var array1: [Int] = [0, 1, 2, 3]
var array2 = array1

// 3
print(address: array1) //0x600000078de0
print(address: array2) //0x600000078de0

// 4
array2.append(4)

// 5
print(address: array1) //0x600000078de0
print(address: array2) //0x6000000aa100

Что происходит в блоке кода выше:

  1. Функция print просто печатает адрес в памяти параметра obj.
  2. Происходит инициализация двух массивов array1 и array2.
  3. Распечатаем адреса этих массивов в памяти. Как мы видим — они одинаковые. Swift просто оптимизирует процесс копирования. Зачем создавать новый объект в памяти, если объекты одинаковые?
  4. Изменим второй массив. В этом месте сработает механизм Copy-on-Write.
  5. Еще раз выводим адреса наших массивов. Как мы видим — они разные!

Также, вы можете настраивать механизм Copy-on-Write на своих собственных типах. Подробнее с реализацией можно ознакомиться в этой статье: Copy on Write in Swift

Сделаем вывод:

  • Механизм Copy-on-Write работает только с коллекциями.
  • Копирование происходит при мутации коллекции.
  • При копировании создается новый адрес в памяти.
  • Данный механизм можно реализовать для собственных типов.

Больше информации:

Выразить благодарность или найти уникальный материал вы можете в boosty.

Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *