Основы программирования
Память стека и кучи
Концепции программирования

Обзор памяти стека и кучи
И стек, и куча — это типы памяти, доступные нашему коду для использования во время выполнения. Память стека и кучи структурированы по-разному. Все данные, хранящиеся в стеке, должны иметь известный и фиксированный размер во время компиляции. С другой стороны, данные неизвестного размера во время компиляции или размера, который может измениться во время выполнения, должны вместо этого храниться в куче.
Память стека

стек – это особая область памяти нашего компьютера, в которую данные добавляются или удаляются по принципу "последний пришел, первый ушел" (LIFO). Подумайте о стопке блинов, как показано на рисунке выше: когда мы добавляем еще блины, мы кладем их на вершину стопки, а когда нам нужен блин, мы снимаем один сверху. Добавление или удаление блинов из середины или снизу не сработает.
Добавление данных в стек называется удалением, а удаление данных из стека называется извлечением.
Когда функция выполняется, она может добавить некоторые данные своего состояния на вершину стека; при выходе из функции память будет автоматически освобождена из стека. Тот факт, что при выходе из функции все ее переменные извлекаются (освобождаются) из стека (и, таким образом, теряются навсегда), имеет решающее значение для понимания стека. Таким образом, стековые переменные локальны по своей природе.
Обратите внимание, что размер выделяемой памяти известен во время компиляции, а во время выполнения требуемая память выделяется в стеке. Также обратите внимание, что существует ограничение (которое зависит от разных ОС) на размер переменных, которые можно хранить в стеке — это не относится к переменным, размещенным в куче.
Преимущества использования стека
- Поскольку данные добавляются и удаляются в порядке последним пришел – первым обслужен, выделение памяти на основе стека выполняется очень просто и, как правило, быстрее, чем выделение памяти на основе кучи, поскольку операционной системе не нужно выполнять поиск. для места для хранения новых данных, потому что это место всегда находится наверху стека.
- Нет необходимости самому управлять памятью — выделение и освобождение памяти происходит автоматически.
- Поскольку ЦП так эффективно организует память стека, чтение и запись в переменные стека выполняются очень быстро.
Недостатки использования стека
- Память стека очень ограничена.
- Произвольный доступ невозможен.
Куча памяти

Как упоминалось выше, куча — это один из типов памяти. Данные с неизвестным размером во время компиляции или размером, который может измениться (увеличиться или уменьшиться) во время выполнения, должны храниться в куче.
Как это работает?
Когда мы помещаем данные в кучу, мы запрашиваем определенное количество места. Операционная система находит достаточно большое пустое место в куче, помечает его как используемое и возвращает указатель, являющийся адресом этого места. Этот процесс называется выделением памяти в куче и иногда обозначается просто как выделение.
Недостатки использования кучи
- Выделение пространства в куче требует больше усилий, потому что операционная система должна сначала найти достаточно большое пространство для хранения данных, а затем выполнить учет, чтобы подготовиться к следующему выделению.
- Доступ к данным в куче медленнее, чем доступ к данным в стеке, потому что мы должны следовать указателю, чтобы добраться туда.