Каков источник термина "куча" для свободного хранилища?

С компьютерами сегодняшнего дня вы можете избавиться от выделения очень больших строк (сотни тысяч символов), в то время как вряд ли сделайте вмятину в использовании ОЗУ компьютера. Поэтому я не стал бы слишком беспокоиться.

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readinput()
{
#define CHUNK 200
   char* input = NULL;
   char tempbuf[CHUNK];
   size_t inputlen = 0, templen = 0;
   do {
       fgets(tempbuf, CHUNK, stdin);
       templen = strlen(tempbuf);
       inputlen += templen;
       input = realloc(input, inputlen+1);
       strcat(input, tempbuf);
    } while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n');
    return input;
}

int main()
{
    char* result = readinput();
    printf("And the result is [%s]\n", result);
    free(result);
    return 0;
}

Обратите внимание, что это упрощенный пример без проверки ошибок; в реальной жизни вам нужно будет убедиться, что ввод в порядке, подтвердив возвращаемое значение fgets.

Также обратите внимание, что в конце, если процедура readinput, никакие байты не теряются; строка имеет точный размер памяти, который должен иметь.

22
задан Uri 19 March 2009 в 03:43
поделиться

9 ответов

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

Несколько авторов начали приблизительно в 1975 называть пул доступной памяти "кучей". Но в существующем ряду книг, мы будем использовать то слово только в его более традиционном смысле, связанном с приоритетными очередями. ( Фундаментальные Алгоритмы, 3-й редактор , p. 435)

34
ответ дан Bill the Lizard 29 November 2019 в 03:29
поделиться

Если это имеет значение ALGOL68, который предшествовал C, имел фактическое ключевое слово heap, которое использовалось для выделения места для переменной от "глобальной "кучи"", в противоположность loc, который выделил его на стеке.

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

Как большинство имен, это, вероятно, думалось некоторым кодером, которому просто было нужно имя.

я часто слышал о нем называемый ареной иногда (сообщение об ошибке, от многие луны назад говоря, что "арена памяти была повреждена"). Это поднимает изображения блоков сражения выполнения памяти в гладиаторском стиле в Вашем адресном пространстве (а-ля фильм Трон).

Нижняя строка, это - просто название области памяти, Вы могли точно также назвать это пулом кирпича или sbrk-пулом (после того, как вызовы для изменения его) или любое из дюжины других имен.

я помню, когда мы соединяли comms стеки протоколов даже перед OSI модель, с 7 слоями была мерцанием в чьем-то глазу, мы использовали многоуровневый подход и должны были придумать имена на каждом слое для блоков.

Мы использовали блоки, сегменты, блоки, разделы и различные другие имена, все, что просто указало на вещь фиксированной длины. Может случиться так, что "куча" возникла:

Carol: "Эй, Bob, что такое хорошее название структуры данных, которая просто скупо выдает случайные биты памяти от большой площади?"

Bob: "Как насчет 'дымящейся груды экскрементов лошади'?"

Carol: "Спасибо, Bob, я просто выберу '"кучу"', если это будет хорошо с Вами. Между прочим, как дела идут с разводом?"

17
ответ дан paxdiablo 29 November 2019 в 03:29
поделиться

Это назвало "кучу" для контрастирующего изображения, до которого это колдует что стек .

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

    Stack like a stack of papers

  • В "куче", нет никакого особого порядка к способу, которым помещаются объекты. Можно достигнуть в и удалить объекты в любом порядке, потому что нет никакого ясного 'главного' объекта.

    Heap like a heap of licorice allsorts

Это делает довольно хорошее задание описания двух способов выделить и освободить память в стеке и "куче". Конфетка!

17
ответ дан thomasrutter 29 November 2019 в 03:29
поделиться

Я не знаю, является ли это первым, но Алгол 68 имел ключевое слово '"куча"' для выделения памяти от "кучи" свободной памяти.

первое использование '"кучи"', вероятно, будет найдено где-нибудь между 1958, когда John McCarthy изобрел сборку "мусора" для Lisp и разработку Алгола 68

3
ответ дан Arnold Spence 29 November 2019 в 03:29
поделиться

Это не заказано. "Куча" устройства хранения данных.

Это не заказанный структура данных "кучи" .

3
ответ дан S.Lott 29 November 2019 в 03:29
поделиться

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

1
ответ дан James McMahon 29 November 2019 в 03:29
поделиться

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

2
ответ дан Crashworks 29 November 2019 в 03:29
поделиться

Я всегда полагал, что это был своего рода умный способ описать это по сравнению со стеком. "Куча" похожа на переросший, неорганизованный стек.

1
ответ дан Jon B 29 November 2019 в 03:29
поделиться

"Куча" обычно имеет эти функции:

  1. Вы не можете предсказать адрес блока malloc () возвраты.

  2. Вы понятия не имеете о том, как адрес, возвращенный следующим malloc (), связан с адресом предыдущего.

  3. Вы можете malloc () блоки переменных размеров.

, Таким образом, у Вас есть что-то, что может сохранить набор блоков переменных размеров и возвратить их в некотором обычно непредсказуемом порядке. Как еще Вы назвали бы его если не "куча"?

0
ответ дан sharptooth 29 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: