В этой статье рассмотрим механизм 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
Что происходит в блоке кода выше:
- Функция print просто печатает адрес в памяти параметра obj.
- Происходит инициализация двух массивов array1 и array2.
- Распечатаем адреса этих массивов в памяти. Как мы видим — они одинаковые. Swift просто оптимизирует процесс копирования. Зачем создавать новый объект в памяти, если объекты одинаковые?
- Изменим второй массив. В этом месте сработает механизм Copy-on-Write.
- Еще раз выводим адреса наших массивов. Как мы видим — они разные!
Также, вы можете настраивать механизм Copy-on-Write на своих собственных типах. Подробнее с реализацией можно ознакомиться в этой статье: Copy on Write in Swift
Сделаем вывод:
- Механизм Copy-on-Write работает только с коллекциями.
- Копирование происходит при мутации коллекции.
- При копировании создается новый адрес в памяти.
- Данный механизм можно реализовать для собственных типов.
Больше информации:
Выразить благодарность или найти уникальный материал вы можете в boosty.
Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.