
Комментарии 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
Разбираемся с existential container в Swift