C ++, Free-Store против кучи - PullRequest
107 голосов
/ 29 августа 2009

Динамическое распределение с new/delete, как говорят, происходит в free-store ,
, в то время как malloc/free использует операции heap .

Я хотел бы знать, есть ли фактическая разница на практике.
Компиляторы делают различие между этими двумя терминами? ( Бесплатный магазин и Куча , а не new/malloc)

Ответы [ 7 ]

68 голосов
/ 29 августа 2009

См. http://www.gotw.ca/gotw/009.htm; он может описать различия между кучей и бесплатным хранилищем гораздо лучше, чем я мог:

Free-магазин:

Бесплатный магазин - один из двух области динамической памяти, выделенные / освобожденные по новой / удалить. Время жизни объекта может быть меньше, чем время хранения выделено; то есть бесплатные объекты магазина может иметь память, выделенную без быть немедленно инициализированным и может быть уничтоженным без памяти немедленно освобожден. В течение период, когда выделено хранилище но вне времени жизни объекта, доступ к хранилищу и манипулировать через пустоту * но ни один нестатического объекта протообъекта члены или функции-члены могут быть получить их адреса, или иным образом манипулировать.

Heap:

куча другой динамической памяти площадь, выделенная / освобожденная malloc / free и их варианты. Обратите внимание, что в то время как по умолчанию глобальный новый и удалить может быть реализовано с точки зрения Malloc и свободным от конкретного компилятор, куча не такая как Свободный магазин и память выделены в одном область не может быть безопасно освобождена в другой. Память, выделенная из куча может быть использована для объектов класса тип по размещению-новое строительство и явное уничтожение. Если так используется, то заметки о сроке службы бесплатного магазина примените аналогично здесь.

53 голосов
/ 08 февраля 2012

Для C ++ разница между бесплатным хранилищем и кучей стала чисто концептуальной. Как банка для сбора жуков, и одна для сбора печенья. Один помечен в одну сторону, другой другой. Это обозначение указывает на то, что вы НИКОГДА не смешиваете «new» и «delete» с «malloc», «realloc» или «free» (или наборы битовых уровней в этом отношении).

Во время интервью полезно сказать, что «new и delete используют free store, malloc и free используют кучу; new и delete вызывают соответственно конструктор и деструктор, а malloc и free - нет». Тем не менее, вы часто будете слышать, что сегменты памяти действительно находятся в одной и той же области - однако МОЖЕТ быть зависимым от компилятора, то есть возможно, что оба могут определять разные пространства памяти в качестве пулов (не знаю, почему это так, хотя).

22 голосов
/ 29 августа 2009

Ответ Майка Коваля охватывает теорию достаточно хорошо. На практике, однако, они почти всегда являются одной и той же областью памяти - в большинстве случаев, если вы изучите реализацию компилятора new, вы обнаружите, что она вызывает malloc().

Другими словами: с точки зрения машины, куча и свободное хранилище - это одно и то же. Различие существует внутри компилятора.

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

2 голосов
/ 03 мая 2014

Куча и free-store не должны быть совместимыми. В ограниченном контексте, как в 8-битных микроконтроллерах AVR со стандартной библиотекой c ++ 11, их даже нельзя использовать в одной и той же программе. Свободное хранилище и куча занимают свои места в одном и том же пространстве памяти, перезаписывая друг друга структуры и данные. В этом контексте Free store отличается и несовместим с Heap, поскольку «библиотека нового хранилища / удалить бесплатное хранилище» проще (и быстрее), чем «библиотека кучи Malloc / free / realloc / calloc» и, таким образом, обеспечивает огромный прирост использования памяти для C ++ встроенный программист (в контексте, где у вас всего 512 байт оперативной памяти).

См. 8-битную стандартную библиотеку c ++ 11/14 по адресу https://github.com/ambroise-leclerc/ETL/tree/master/libstd

2 голосов
/ 29 августа 2009

Термин «куча» может также относиться к конкретной структуре данных, но в контексте операций malloc, free, new и delete в C ++ термины «куча» и «свободное хранилище» используются более или менее взаимозаменяемо.

1 голос
/ 29 августа 2009

Я не помню, чтобы в стандарте упоминалось слово heap, за исключением описаний функций кучи, таких как push_heap et al. Все динамические распределения выполняются в бесплатном магазине.

0 голосов
/ 11 января 2017

Free Store - это пул нераспределенной памяти кучи, предоставленной программе, которая используется программой для динамического выделения во время выполнения программы. Каждой программе предоставляется пул нераспределенной памяти кучи, которую она может использовать во время выполнения. Этот пул доступной памяти называется бесплатным хранилищем программы. Выделенная свободная память хранилища не называется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...