C ++, Free-Store против Heap


124

new/deleteГоворят, что динамическое размещение выполняется в свободном хранилище ,
а malloc/freeоперации используют кучу .

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

Ответы:


76

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

Free-магазин:

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

Heap:

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


23
Я не согласен. Слово «куча» в контексте динамического распределения не используется ни в стандарте C ++, ни в C99 (у меня нет C89, на который ссылается C ++, не стесняйтесь поправлять меня, если он использует это слово). Я не смог найти дату публикации рассматриваемого GotW, но, поскольку в нем говорится о черновике, он явно является предварительным стандартом.
avakar

2
Это все вопрос терминологии, имхо. Скажите, мистер. Страуструп не различает «кучу» и «свободное хранилище»: stroustrup.com/Programming/17_free_store.ppt , слайд 12. «Куча» использовалась как синоним динамической памяти задолго до C ++, со времен Лиспа (1960-е годы), который использовал структура данных кучи для выделения памяти.
Алексей Войтенко

Я вообще думаю о куче (через maloc / free) как о своего рода «сырье». Вы просите кусок памяти, вы получаете без излишеств. Вы должны сами строить любые конструкции. Бесплатный магазин (новый / удаленный) больше похож на поставщика готовой продукции. Вы запрашиваете объект, и ему выделяется место, а также объект, который он построил и подготовил для вашего использования. Когда он закончится, он будет хорошо очищен.
Аншуман Кумар

67

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

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


28

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

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

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


5

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


3

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

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


2

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


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.