Обновить

Комментарии 6

В swift есть механизм copy-on-write, и на Хабре есть отдельная статья о том, что структуры при обычном присваивании переменной НЕ копируются. Ссылочные типы по умолчанию не копируются вообще - вам нужно принудительно создавать их копию.

Тогда откуда у вас взялись какие-то там copy-подобные вызовы?

Вопрос хороший! Здесь я рассказал именно про копирование содержимого existential container, а именно указателей на буфер значений, value witness table и protocol witness table, например, при присваивании переменной. Механизм copy-on-write, как вы и сказали, относится к значению внутри буфера значений existential container - то есть к самому экземпляру структуры.

Пока нет никаких изменений, то в обоих existential container будет лежать указатель на один и тот-же буфер значений. Когда какое-то поле структуры поменяется, тогда и буфер значений будет скопирован в другое место и старый указатель в existential container поменяется на новый.

тогда интересно, что происходит в момент простого присваивания структуры - приложение же должно как-то запомнить, что потом нужно скопировать эту переменную

Не понял ваш вопрос. Можете показать пример в коде?

Existential container занимает 5 машинных слов или 40 байт

Не всегда. Для class-constrained-протоколов это не так:

protocol A {}
protocol B: AnyObject {}

print(MemoryLayout<A>.size) // 40
print(MemoryLayout<B>.size) // 16

Спасибо за замечание! Я добавлю это уточнение в статью.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации