Есть ли в памяти процесса специальный сегмент, выделенный под динамическую память? С++

Если я все правильно понимаю, то стек - это заранее выделенный кусок памяти. Поэтому при появлении новых переменных в стеке они записываются и считываются быстро. А что насчет динамической памяти? Правильно ли я понимаю, что на уровне адресного пространства куча не имеет какого-то выделенного сегмента и под "кучей" подразумевается все остальное свободное адресное пространство, которое выделяется по мере необходимости в рантайме? И при этом выделяется не сразу кусок памяти на все, как стек, а только под конкретную переменную?

Или же у нас при запросе на выделение памяти в куче выделяется страница памяти и все переменные, созданные при помощи new пишутся и читаются оттуда, а когда память на странице кончается, то выделяется еще одна?


Ответы (1 шт):

Автор решения: Serge3leo

Если я все правильно понимаю, то стек - это заранее выделенный кусок памяти.

Примерно так, но следует отметить:

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

И при этом выделяется не сразу кусок памяти на все, как стек, а только под конкретную переменную?

Менеджеры памяти могут иметь разные алгоритмы. Обычно, у менеджера есть пул свободных страниц, под которые уже выделено адресное пространство. По возможности, new/malloc() выделяет память из него, а delete/free() возвращает память в него, но при нехватке или избытке менеджер памяти запрашивает у ОС дополнительное адресное пространство или возвращает излишки.

Пулов может быть несколько, для разных размеров, с целью уменьшения фрагментации, или для разных потоков многопоточного приложения, с целью уменьшения интерференции кэш и взаимных блокировок.

→ Ссылка