Наименование | Стек (Stack) | Куча (Heap) «free store», «свободное хранилище» |
---|---|---|
Размещение элементов | В ОЗУ, все элементы стека расположены один за другим в одной выделенной области памяти - стеке. | В ОЗУ, элементы кучи могут быть разбросаны по всей памяти |
Ограничения размера памяти | Размер стека ограничен ОС и компилятором (обычно единицы мегабайт) | Размер кучи ограничен доступной физической памятью |
Скорость доступа к элементам | У стека быстрая скорость доступа к элементам (элементы идут один за другим) | У кучи медленная скорость доступа к элементам (требуется разыменование указателя, элементы могут быть разбросаны по разным сегментам памяти) |
Доступ к элементам | У стека доступ к элементам по принципу LIFO (последний пришел - первый ушел, аналогия со стопкой тарелок или пачкой бумаги). Элементы добавляются/удаляются и считываются из вершины стека. Возможно считать элемент не из вершины стека (указывается индекс отступа от вершины стека) | У кучи произвольный доступ к элементам. |
Объекты хранения | Стек вызова функций (адреса возврата, содержание регистров процессора, аргументы функции, локальные переменные функции и т.д.).
Переменные и объекты созданные внутри функции (кроме динамических) будут размещены в стеке, в противном случае - в куче. При рекурсии будет сохранено столько раз в стеке сколько вызывается рекурсивных функций. | Динамические объекты (созданные new или malloc) |