Когда программа создаст несколько куч? - PullRequest
0 голосов
/ 09 ноября 2019

Если и когда c ++ запускает операцию выделения вторичной кучи, и есть ли причины, по которым кто-то захочет выделить более одной кучи? Любые стандартные действия в c ++, такие как создание нового пространства имен, запускают это, как память обрабатывает несколько объектов с одинаковыми именами?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

C ++ не диктует использование кучи, тем более использование вторичной кучи. Это детали реализации, которые оставляются на усмотрение каждого компилятора. Что касается языка, переменные могут иметь динамическую продолжительность хранения , но в стандарте не говорится, как это достигается.

На практике все известные мне компиляторы используют кучупамять для динамических распределений. Теоретически, каждый метод выделения (new против malloc) может иметь свою собственную кучу, но нет особых причин усложнять управление памятью, вводя больше куч, чем необходимо. Кроме того, вы не должны смешивать методы распределения. Преимущества использования нескольких куч зависят от ручной настройки, которая в настоящее время находится за пределами возможностей компиляторов. (Программист может реализовать несколько куч, но это не то же самое, что «запуск» нескольких куч.)

Пространства имен и имена объектов являются несвязанными темами, так как они не существуют в исполняемом файле (если не сохранены как примечаниядля отладчика).

0 голосов
/ 09 ноября 2019

Согласно статье Dartmouth_edu в моем комментарии выше, программа довольно часто использует несколько куч. «Компиляторы IBM C и C ++ позволяют создавать и использовать собственные пулы памяти, называемые кучами».

  • Хорошие примеры, если вы думаете, что объект кучи может повредить кучу, изолируют ее в собственной куче.
  • Если вы выделите целую кучу для многокомпонентного объекта, вы можете просто уничтожить кучу вместо того, чтобы освободить память каждого компонента.
  • Если вы хотите заняться такими причудливыми вещами, как многопоточность! Вы также можете ускорить доступ к памяти, позволив одному потоку освободить память из своей кучи, в то время как другой использует свою собственную отдельную кучу.

Обычные действия пользователя не создают новые кучи. Явное создание новой кучи создает новую кучу. Пространства имен обрабатываются областями и указателями адресной памяти. @parktomatomi спасибо за помощь.

...