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

Является ли куча на самом деле кучей?

Возможные дубликаты:
Почему две разные концепции называются "кучей" ?
Какова связь между "кучей" и "кучей" ?

В .NET(и Java, насколько я знаю) область, где объекты динамически распределены, называется управляемой кучей. Тем не менее, большинство документации, которые описывают, как работает управляемая куча, изображают ее как линейную структуру данных, такую ​​как связанный список или стек.

Итак, управляемая куча фактически heap или реализована с другой структурой данных? Если на самом деле он не использует структуру данных кучи, это кажется значительным провалом терминологии, чтобы перегрузить смысл этого слова.

Если это фактически структура данных кучи, каково значение, которое удовлетворяет свойству кучи: размер выделенной области памяти?

4b9b3361

Ответ 1

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

Ответ 2

В этом смысле "куча" означает: специальную область памяти, используемую для хранения важных ресурсов. В этом контексте это не связано с "структурой данных кучи".

Ответ 3

Я, конечно, не имею исторических знаний, чтобы комментировать это с любым авторитетом, но я считаю, что термин "куча", используемый для описания механизма выделения памяти для объектов с более длинным сроком жизни в .NET и Java, вызывающая воспоминания, описательная словоподобная, эта большая неструктурированная (с точки зрения разработчиков) масса памяти, где живет человек. "Стек", напротив, вызывает изображение гораздо более структурированной области данных (опять же, с точки зрения разработчика): "where" вещи живут в стеке, чувствуют себя гораздо более актуальными, чем "where" они живут в куче.

Это явно отличается от фактической структуры данных кучи, которая использует слово "куча" для обозначения так называемого свойства кучи (из Википедии):

если B - дочерний элемент node для A, затем клавиша (A) ≥ (B).

Так что да, они на самом деле не связаны. Один из них - просто описательный термин, тогда как другой имеет гораздо более формальное определение.

Ответ 4

Я не уверен в своем ответе, но насколько я знаю на таких языках, как С# или Java, где память управляется моим сборщиком мусора, область памяти не является линейной. GC освобождает память, которая может освобождаться, а когда память низкая, она сжимает память, делая некоторую дефрагментацию. Он перемещает блоки памяти, которые использует программа, чтобы сделать некоторое пространство в "конце". Зачем вам этот ответ? Вы хотите сделать некоторое управление памятью низкого уровня?