Какие последствия будут, если у структуры в Swift убрать оптимизацию Copy-on-Write?

«Какие последствия будут, если у структуры в Swift убрать оптимизацию Copy-on-Write?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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:

  1. Снижение производительности — избыточные копии больших данных даже при отсутствии изменений.
  2. Увеличение потребления памяти — дублирование данных в RAM.
  3. Потенциальные проблемы с производительностью в 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 }
    }
}