Value Types (хранятся в стеке) | Reference Types (хранятся в куче) |
---|---|
Основные типы данных: Int, Bool, Char | Closure |
Struct | Class |
Enum | Function |
Float, Double | |
Tuple | |
Collections: Set, String, Array, Dictionary |
Основным отличием ссылочных типов от типов значений является то, что первые передаются по ссылкам, в то время как вторые копируются.
На скорость копирования влияет то, что примитивные типы, такие как целые числа и числа с плавающей запятой, хранятся в регистрах ЦП, и при их копировании нет необходимости обращаться к оперативной памяти. Но большинство расширяемых типов Swift, таких как строки, массивы, наборы и словари, используют другую логику - копируются при записи(copy-on-write).
У этого есть ряд своих плюсов таких как то, что типы значений работают быстрее, потому что хранятся на стеке, а не в куче, используют статическую диспетчеризацию и прочее.
Однако можно задаться вопросом “а зачем копировать данные, если мы их не меняем?”. Пример, представьте себе массив с 1000 элементами внутри него: если вы скопируете этот массив в другую переменную, Swift должен будет скопировать все 1000 элементов, даже если два массива окажутся одинаковыми.
Эта проблема решается с помощью копирования при записи: когда вы указываете две переменные на один и тот же массив, они обе указывают на одни и те же базовые данные. А само полное копирование происходит только в момент мутации.
Таким образом, откладывая операцию копирования до тех пор, пока она действительно не понадобится, Swift может гарантировать, что работа не будет выполнена впустую.
3.1.2.3 Heap Theme | Back To iOSWiki Contents | 3.1.3 Reference Theme Folder