Выбор ответа Middle Типы значений и ссылочные спрашивают часто обновлено

Copy-on-write у Array: когда копируется буфер

Вопрос

Массив на миллион элементов присвоили второй переменной: var b = a. Когда реально копируются элементы?

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

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

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

Коротко

Правильный ответ: При первом изменении, если буфер ещё общий. Array, Dictionary, Set и String реализуют copy-on-write: после присваивания обе переменные разделяют один буфер, а перед первой мутацией стандартная библиотека проверяет isKnownUniquelyReferenced и копирует буфер, если он не уникален.

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

  1. Сразу при присваивании, это O(n) копирование
  2. Никогда: массивы в Swift ссылочные, буфер общий
  3. При первом изменении, если буфер ещё общийправильный ответ
  4. Только при передаче массива в другой поток

Разбор

Array, Dictionary, Set и String реализуют copy-on-write: после присваивания обе переменные разделяют один буфер, а перед первой мутацией стандартная библиотека проверяет isKnownUniquelyReferenced и копирует буфер, если он не уникален. Поэтому присваивание дешёвое, а семантика остаётся семантикой значения. Ссылочными массивы не становятся, и потоки тут ни при чём.

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

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