Почему динамическая куча используется для динамического выделения памяти в языках стиля C и структура данных называется "кучей"? Есть ли какая-то связь?
Почему динамическая куча используется для динамического выделения памяти в языках стиля C и структура данных называется "кучей"? Есть ли какая-то связь?
Ответы:
Дональд Кнут говорит (Искусство компьютерного программирования, третье издание, том 1, стр. 435):
В 1975 году несколько авторов стали называть пул доступной памяти «кучей».
Он не говорит, какие авторы и не дает ссылки на какие-либо конкретные статьи, но говорит, что использование термина «куча» по отношению к приоритетным очередям является традиционным смыслом этого слова.
У них одинаковое имя, но они на самом деле не похожи (даже концептуально). Куча памяти называется кучей так же, как вы называете корзину для белья «кучей одежды». Это имя используется для обозначения несколько грязного места, где память может быть выделена и освобождена по желанию. Структура данных (как указывает ссылка на Википедию) совершенно иная.
Название столкновения вызывает сожаление, но не все так загадочно. Куча - это небольшое общее слово, которое используется для обозначения кучи, коллекции, группы и т. Д. Использование слова для структуры данных предшествует (я почти уверен) имени пула памяти. Фактически, пул был бы намного лучшим выбором для последнего, по моему мнению. Куча обозначает вертикальную структуру (например, кучу), которая соответствует структуре данных, но не пулу памяти. Мы не думаем о куче пула памяти как иерархической, в то время как фундаментальная идея структуры данных заключается в том, чтобы держать самый большой элемент в верхней части кучи (и вложенных куч).
Куча структуры данных восходит к середине 60-х годов; куча пула памяти, начало 70-х. Термин «куча» (означающий пул памяти) был использован, по крайней мере, еще в 1971 году Вийнгаарденом в дискуссиях об Алголе.
Возможно, самое раннее использование кучи в качестве структуры данных было найдено семью годами ранее в
Williams, JWJ 1964. «Алгоритм 232 - Heapsort», Communications of ACM 7 (6): 347-348
На самом деле, чтение о том, как распределяется память (см. « Блоки блоков» ), напоминает мне о куче структур данных.
ИМО это просто случайность / совпадение, что эти две совершенно не связанные вещи имеют одно и то же имя. Это как график и график .
Подобная куче структура данных используется алгоритмом нахождения доступной памяти. Ниже приводится выдержка из http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Когда
new
вызывается, он начинает искать свободный блок памяти, который соответствует размеру вашего запроса. Предполагая, что такой блок памяти найден, он помечается как зарезервированный и возвращается указатель на это место. Есть несколько алгоритмов для достижения этой цели, потому что необходимо найти компромисс между сканированием всей памяти для нахождения наименьшего свободного блока, который больше размера вашего объекта, или возвращением первого, где подходит нужная память. Чтобы повысить скорость получения блока памяти, свободные и зарезервированные области памяти поддерживаются в структуре данных, аналогичной двоичным деревьям, называемым кучей.
Разговорные термины стековая память и кучная память не используются в стандарте C ++. Стандарт использует статическое хранение, хранение потоков, автоматическое хранение и динамическое хранение.
Более подробную информацию можно найти в разделе «Стандарт хранения» .
Следовательно, с точки зрения языка и стандартной библиотеки, нет никакой путаницы.
Q. Что такое куча? A. Куча - это совокупность объектов, расположенных друг над другом.
Ответ на ваш вопрос: и куча памяти, и двоичная куча используют ту же концепцию, что и вы. Данные хранятся в виде кучи в памяти в том же порядке, в котором они записаны в программе, тогда как бинарная куча - это структура данных, которая следует той же концепции хранения данных в упорядоченном виде в виде кучи (данные сверху другого). Дайте мне знать, что вы думаете в разделе комментариев.
Возможно, первая реализованная куча памяти управлялась структурой кучи?