## Heap

1. [Programming Concepts: The Stack and the Heap](https://thecodeboss.dev/2014/10/programming-concepts-the-stack-and-the-heap/)
2. [Визуализация работы Heap](https://www.youtube.com/watch?v=95_CAUC9nvE&ab_channel=DeepuKSasidharan)

Куча — это хранилище памяти, также расположенное в оперативной память ([ОЗУ/RAM](./3.1.2.1%20RAM.md)), которое допускает динамическое выделение памяти и не работает по принципу стека: это просто склад для ваших переменных. Когда вы выделяете в куче участок памяти для хранения переменной, к ней можно обратиться не только в потоке, но и во всем приложении. Именно так определяются глобальные переменные. По завершении приложения все выделенные участки памяти освобождаются. Размер кучи задаётся при запуске приложения, но, в отличие от стека, он ограничен лишь физически, и это позволяет создавать динамические переменные.

> При этом куча может быть фрагментирована (иногда довольно сильно)

Поэтому кучей сложнее, чем со стеком, поскольку именно из-за его фрагментации и простая операция извлечения значения из него может вылиться в десятки (если не сотни) телодвижений процессора.

> Когда заводим переменную в куче, то переменная доступна не только во время жизни потока, но и на протяжении работы всей программы/приложения.

Вы взаимодействуете с кучей посредством ссылок, обычно называемых указателями — это переменные, чьи значения являются адресами других переменных. Создавая указатель, вы указываете на местоположение памяти в куче, что задаёт начальное значение переменной и говорит программе, где получить доступ к этому значению. Из-за динамической природы кучи ЦП не принимает участия в контроле над ней; в языках без сборщика мусора (C, C++) разработчику нужно вручную освобождать участки памяти, которые больше не нужны. Если этого не делать, могут возникнуть утечки и фрагментация памяти, что существенно замедлит работу кучи.

В сравнении со стеком, куча работает медленнее, поскольку переменные разбросаны по памяти, а не сидят на верхушке стека. Некорректное управление памятью в куче приводит к замедлению её работы; тем не менее, это не уменьшает её важности — если вам нужно работать с динамическими или глобальными переменными, пользуйтесь кучей.

> Heap распределение памяти происходит во время runtime

---

[3.1.2.2 Stack Theme](3.1.2.2%20Stack.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.2.4 Copy On Write Theme](./3.1.2.4%20Copy-On-Write.md)
