Ответ
Copy-on-write (CoW) не реализован для простых типов (Int, Double, Bool и т.д.) из-за соображений производительности, семантики и практической целесообразности.
Технические причины:
-
Низкая стоимость копирования — простые типы имеют фиксированный небольшой размер:
Int,Double: 8 байтBool: 1 байт- Копирование дешевле, чем проверка уникальности ссылки и управление буфером
-
Накладные расходы CoW — реализация потребовала бы:
- Хранения счетчика ссылок (+8 байт минимум)
- Динамической аллокации памяти в куче
- Проверки уникальности при каждой модификации
-
Семантика 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.