Подтвердить что ты не робот

С++, Free-Store против кучи

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

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

4b9b3361

Ответ 1

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

Free-магазин:

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

Heap:

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

Ответ 2

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

Во время собеседований хорошо сказать, что "новые и удаленные используют бесплатный магазин, malloc и бесплатное использование кучи, новые и удаленные вызовы конструктора и деструктора, соответственно, однако malloc и free do not". Тем не менее, вы часто слышите, что сегменты памяти действительно находятся в одной и той же области, однако CAN может быть специфичным для компилятора, то есть, возможно, что оба могут обозначать разные пространства памяти как пулы (не уверен, почему это было бы, хотя).

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Куча и 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.

Ответ 6

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

Ответ 7

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