Ответ
Copy-on-Write (CoW) — это оптимизация, при которой копирование данных value-типа (например, структуры) откладывается до момента модификации одной из копий.
Без CoW структура будет копироваться всегда при присваивании или передаче:
struct LargeStruct {
var data: [Int] = Array(repeating: 0, count: 1_000_000)
}
var original = LargeStruct() // Выделена память под массив
var copy = original // БЕЗ CoW: происходит полное копирование массива
// С CoW: копируется только ссылка, память не дублируется
copy.data[0] = 42 // Только здесь CoW выполнит реальное копирование
Последствия отсутствия CoW:
- Снижение производительности — избыточные копии больших данных даже при отсутствии изменений.
- Увеличение потребления памяти — дублирование данных в RAM.
- Потенциальные проблемы с производительностью в UI — частые копии больших структур могут блокировать главный поток.
Когда CoW особенно важен:
- Структуры, содержащие большие массивы, строки или словари.
- Типы, часто передаваемые по значению (например, в качестве параметров функций).
Реализация CoW вручную:
struct CoWStruct {
private var box: RefBox<[Int]>
var data: [Int] {
get { box.value }
set {
if !isKnownUniquelyReferenced(&box) {
box = RefBox(newValue) // Копируем только при записи, если есть другие ссылки
return
}
box.value = newValue
}
}
private class RefBox<T> {
var value: T
init(_ value: T) { self.value = value }
}
}