4. Почему для всех value type не поддерживают семантику copy-on-write?Теория

Темы

Компании

Ответ

Для маленьких типов это дороже, чем просто скопировать поля. Поэтому copy-on-write оставляют там, где данных много. У коллекций, у String, у Data. У обычного struct его нет, пока его не сделают сами.

Что copy-on-write добавляет в тип

  • лишний объект в куче, даже если внутри одно число
  • чтение и запись идут через обёртку
  • проверка уникальности на каждое изменение
  • копия данных в момент записи, если владельцев больше одного
  • эту схему пришлось бы писать в каждом value type, даже в самом лёгком struct

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

  • нужен вынесенный в кучу буфер и счётчик ссылок на него
  • запись должна проверить уникальность и иногда скопировать всё сразу
  • для маленького значения накладные расходы больше, чем сама копия