Почему в Swift нет copy-on-write для простых типов вроде Int?

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

Ответ

Copy-on-write (CoW) не реализован для простых типов (Int, Double, Bool и т.д.) из-за соображений производительности, семантики и практической целесообразности.

Технические причины:

  1. Низкая стоимость копирования — простые типы имеют фиксированный небольшой размер:

    • Int, Double: 8 байт
    • Bool: 1 байт
    • Копирование дешевле, чем проверка уникальности ссылки и управление буфером
  2. Накладные расходы CoW — реализация потребовала бы:

    • Хранения счетчика ссылок (+8 байт минимум)
    • Динамической аллокации памяти в куче
    • Проверки уникальности при каждой модификации
  3. Семантика value types — простые типы должны вести себя как независимые значения:

    var a = 42
    var b = a  // Мгновенное копирование значения
    b = 100    // a остается 42 — ожидаемое поведение

Сравнение с типами, имеющими CoW:

// Array имеет CoW
var array1 = [1, 2, 3, 4, 5]
var array2 = array1          // Нет копирования, общий буфер
array2.append(6)            // ТОЛЬКО СЕЙЧАС происходит копирование
// array1 = [1, 2, 3, 4, 5]
// array2 = [1, 2, 3, 4, 5, 6]

// Int не имеет CoW
var int1 = 100
var int2 = int1             // Копирование происходит сразу
int2 = 200                  // Простое присваивание
// int1 = 100, int2 = 200

Когда CoW имеет смысл:

  • Большие структуры данных (Array, Dictionary, String)
  • Типы с переменным размером
  • Когда копирование дорого (большие буферы)

Вывод: Для простых типов мгновенное копирование эффективнее и проще, чем сложная оптимизация CoW.