В Swift память распределяется в двух регионах: стеке и куче. Каждый служит отдельной цели и имеет разные характеристики производительности и управления.
Стек использует структуру LIFO (Last In, First Out) и в первую очередь используется для:
struct, enum, кортежи)Выделение памяти в стеке крайне быстро, потому что память просто добавляется и удаляется по мере вызова и возврата функций. Оно автоматически управляется компилятором — никаких накладных расходов во время выполнения.
struct Point { var x, y: Double } // выделяется в стеке
Куча обрабатывает динамически выделенную память и используется для:
class)Выделение памяти в куче медленнее из-за накладных расходов на поиск и резервирование доступной памяти. Оно управляется ARC (Automatic Reference Counting), который отслеживает, сколько ссылок указывают на объект, и освобождает его, когда счётчик достигает нуля.
class User { var name: String } // выделяется в куче
| Стек | Куча | |
|---|---|---|
| Используется для | Value types | Reference types |
| Скорость | Быстрее | Медленнее |
| Управление | Автоматическое (компилятор) | ARC |
| Жизненный цикл | Ограничен областью видимости | Гибкий |
Предпочитай value types, когда данные не нужно разделять между несколькими владельцами — это позволяет хранить их в стеке и избежать накладных расходов ARC. Используй reference types, когда нужно совместное владение или объекты, которые должны жить дольше своей исходной области видимости.
Выделение памяти в стеке быстрее, чем выделение в куче, потому что стек требует только простую операцию инкремента указателя для зарезервирования памяти, в то время как выделение в куче должно искать доступные блоки.
Новый — ещё не проверен сообществом
Вы