0Pricing
Swift Academy · Урок

Стек и куча: где хранятся значения

Узнайте, как структуры хранятся в стеке, а классы — в куче, и как это влияет на производительность.

«Стек и куча: где хранятся значения» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Понимание того, где значения Swift находятся в памяти — в стеке или куче — необходимо для написания производительного и предсказуемого кода.

Стек

Стек — это непрерывный блок памяти, управляемый автоматически: • Локальные переменные и параметры функций находятся здесь • Выделение памяти выполняется за O(1) — достаточно переместить указатель • Память автоматически освобождается при выходе из области видимости • Стек локален для потока — у каждого потока есть собственный стек

Куча

Куча — это общий пул для долгоживущих выделений памяти: • Объекты находятся здесь, когда их время жизни выходит за пределы одной области видимости • Для выделения нужно найти свободную память — это требует больше ресурсов • Для классов кучей управляет ARC • Куча общая для потоков — требуется синхронизация

Структуры находятся в стеке

```swift func compute() { var pt = CGPoint(x: 3, y: 4) // on the stack pt.x += 1 } // pt freed automatically ``` Небольшие структуры передаются копированием — без дополнительных затрат на кучу.

Классы находятся в куче

```swift class Dog { var name: String init(name: String) { self.name = name } } var d = Dog(name: "Rex") // Dog instance on heap // 'd' is a pointer on the stack ```

Большие структуры могут использовать кучу

Большие структуры (массивы, строки и большие типы-значения) используют COW и внутреннее хранилище в куче, хотя ведут себя как типы-значения: ```swift var arr = [Int](repeating: 0, count: 10_000) // The array's buffer is on the heap; 'arr' itself is a stack value ```

Захват в замыканиях

Когда замыкание захватывает переменную типа-значения, которая должна пережить область видимости, Swift помещает её в контейнер в куче: ```swift var count = 0 let increment = { count += 1 } // count captured in a heap box increment() print(count) // 1 ```

Упаковка экзистенциальных типов протоколов

Хранение небольших типов-значений в переменных `any Protocol` может привести к выделению памяти в куче (упаковке экзистенциального типа): ```swift var shape: any Shape = Circle(radius: 5) // may allocate on heap ``` Небольшие типы (≤3 машинных слов) хранятся встроенно; большие типы упаковываются.

Измерение выделений памяти

Используйте шаблон Allocations в Instruments, чтобы видеть выделения памяти в куче: 1. Профилирование > Allocations 2. Фильтруйте по классу или категории 3. Отслеживайте количество вызовов `alloc` и `dealloc` Большое число выделений в циклах часто указывает на неожиданную упаковку.

Последствия для проектирования

• Предпочитайте структуры для типов, хранящих краткоживущие данные, — стек работает быстрее • Используйте классы, когда нужны идентичность или общее состояние • Избегайте выделения памяти в тесных циклах — заранее выделяйте память с помощью `reserveCapacity` • Профилируйте код до оптимизации — преждевременная оптимизация отнимает время

Быстрая проверка

Какой тип памяти автоматически освобождается при выходе из области видимости функции?

Итоги

Ключевые выводы: • Стек: дешёвый, автоматический, локальный для потока, используется типами-значениями • Куча: гибкая, управляется ARC, используется ссылочными типами • Большие структуры используют внутренние буферы в куче (COW) • Замыкания, захватывающие переменные, помещают их в контейнеры в куче • Используйте Instruments Allocations для обнаружения неожиданной нагрузки на кучу Далее: изменение, совместное использование и неожиданное псевдонимирование.

Часто задаваемые вопросы

Урок «Стек и куча: где хранятся значения» бесплатный?

Да — полный текст урока «Стек и куча: где хранятся значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Стек и куча: где хранятся значения»?

Узнайте, как структуры хранятся в стеке, а классы — в куче, и как это влияет на производительность. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Стек и куча: где хранятся значения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Стек и куча: где хранятся значения
  2. Изменение, совместное использование и неожиданное псевдонимирование
  3. Смешанные графы значений и ссылок
  4. Проектирование интерфейсов с семантикой значений
← Назад к Swift Academy