new/delete
Говорят, что динамическое размещение выполняется в свободном хранилище ,
а malloc/free
операции используют кучу .
Я хотел бы знать, есть ли разница на практике.
Различают ли компиляторы эти два термина? ( Бесплатный магазин и куча , нет new/malloc
)
источник
Для C ++ разница между бесплатным хранилищем и кучей стала чисто концептуальной. Как баночка для сбора ошибок и одна для сбора файлов cookie. Один помечен так, другой - другим. Это обозначение предназначено для того, чтобы понять, что вы НИКОГДА не смешиваете "
new
" и "delete
" с "malloc
", "realloc
" или "free
" (или наборами битовых уровней в этом отношении).Во время собеседований хорошо сказать, что «
new
иdelete
использовать бесплатный магазин,malloc
иfree
использовать кучу;new
иdelete
вызывать конструктор и деструктор соответственно,malloc
аfree
не надо». Тем не менее, вы часто будете слышать, что сегменты памяти действительно находятся в одной и той же области - однако это МОЖЕТ быть специфичным для компилятора, то есть возможно, что оба могут обозначать разные пространства памяти как пулы (не уверен, почему это так, хотя).источник
Ответ Майка Коваля хорошо описывает теорию. На практике, однако, это почти всегда одна и та же область памяти - в большинстве случаев, если вы углубитесь в реализацию компилятора
new
, вы обнаружите, что он вызываетmalloc()
.Другими словами: с точки зрения машины, куча и свободное хранилище - это одно и то же. Различие существует внутри компилятора.
Чтобы еще больше запутать ситуацию, до появления C ++ мы говорили «куча», имея в виду то, что сейчас называется «бесплатное хранилище».
источник
Термин «куча» может также относиться к конкретной структуре данных, но в контексте операций C ++ malloc, free, new и delete термины «куча» и «свободное хранилище» используются более или менее взаимозаменяемо.
источник
Не предполагается, что куча и бесплатное хранилище могут взаимодействовать друг с другом. В ограниченных контекстах, таких как 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
источник
Я не припомню, чтобы в стандарте когда-либо упоминалось слово «куча», за исключением описаний таких функций, как «куча»
push_heap
и др. Все динамические распределения выполняются в бесплатном хранилище.источник
Бесплатное хранилище - это пул нераспределенной памяти кучи, предоставленный программе, которая используется программой для динамического выделения во время выполнения программы. Каждой программе предоставляется пул нераспределенной памяти кучи, которую она может использовать во время выполнения. Этот пул доступной памяти называется свободным хранилищем программы. Выделенная свободная память хранилища безымянна.
источник