Выбор ответа Senior ARC и циклы ссылок обновлено

Цена копирования структур со ссылками

Вопрос

Почему структура с пятью полями-классами (или String и массивами) может копироваться заметно дороже, чем кажется?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Каждая копия делает retain всех ссылочных полей, а это атомарные операции. Копия структуры побитовая, но для полей со ссылками (классы, буферы Array, String, замыкания) ARC обязан увеличить счётчики, а атомарные инкременты не бесплатны в горячем цикле.

Варианты ответа

  1. Структура копируется глубоко: вместе с ней копируются и все объекты полей
  2. Копирование структур с полями-классами всегда идёт через выделение в куче
  3. Swift сериализует структуру при копировании, если в ней есть ссылочные поля
  4. Каждая копия делает retain всех ссылочных полей, а это атомарные операцииправильный ответ

Разбор

Копия структуры побитовая, но для полей со ссылками (классы, буферы Array, String, замыкания) ARC обязан увеличить счётчики, а атомарные инкременты не бесплатны в горячем цикле. Глубокого копирования объектов нет, в кучу сама копия не уходит, сериализации нет. Оптимизация: меньше ссылочных полей в горячих структурах, borrowing/consuming параметры (Swift 5.9) и вынесение редко меняющихся данных в один класс-хранилище.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.