Выбор ответа Middle Типы значений и ссылочные спрашивают часто обновлено
Copy-on-write у Array: когда копируется буфер
Вопрос
Массив на миллион элементов присвоили второй переменной: var b = a. Когда реально копируются элементы?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При первом изменении, если буфер ещё общий. Array, Dictionary, Set и String реализуют copy-on-write: после присваивания обе переменные разделяют один буфер, а перед первой мутацией стандартная библиотека проверяет isKnownUniquelyReferenced и копирует буфер, если он не уникален.
Варианты ответа
- Сразу при присваивании, это O(n) копирование
- Никогда: массивы в Swift ссылочные, буфер общий
- При первом изменении, если буфер ещё общийправильный ответ
- Только при передаче массива в другой поток
Разбор
Array, Dictionary, Set и String реализуют copy-on-write: после присваивания обе переменные разделяют один буфер, а перед первой мутацией стандартная библиотека проверяет isKnownUniquelyReferenced и копирует буфер, если он не уникален. Поэтому присваивание дешёвое, а семантика остаётся семантикой значения. Ссылочными массивы не становятся, и потоки тут ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Типы значений и ссылочные»
- Как сделать свой copy-on-write
- Existential container: как хранится any Protocol
- Типы значений и ссылочные типы в Swift
- Оператор === в Swift
- Зачем indirect у enum
- Задача на Swift: стек отмены для текстового поля
- let и экземпляр класса: можно ли менять свойства
- Типы Swift: значение или ссылка