Ответ
Для маленьких типов это дороже, чем просто скопировать поля. Поэтому copy-on-write оставляют там, где данных много. У коллекций, у String, у Data. У обычного struct его нет, пока его не сделают сами.
Что copy-on-write добавляет в тип
- лишний объект в куче, даже если внутри одно число
- чтение и запись идут через обёртку
- проверка уникальности на каждое изменение
- копия данных в момент записи, если владельцев больше одного
- эту схему пришлось бы писать в каждом value type, даже в самом лёгком
struct
Copy-on-write окупается на большом буфере: Array, String, Dictionary. Маленький struct вроде точки дешевле скопировать целиком, чем заводить объект в куче и проверять, единственная ли это ссылка.
Такая проверка и сама отложенная копия делают время записи непредсказуемым. Для типа без отдельного буфера прямое копирование проще и быстрее.
- нужен вынесенный в кучу буфер и счётчик ссылок на него
- запись должна проверить уникальность и иногда скопировать всё сразу
- для маленького значения накладные расходы больше, чем сама копия