Что альтернативы к malloc () в C?

Я пишу C для платы MPC 555 и потребности выяснить, как выделить динамическую память, не используя malloc.

21
задан Earlz 11 February 2010 в 00:37
поделиться

12 ответов

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

Сокет, который не удалось подключить, может находиться не в ТОЧНО том же состоянии, что и совершенно новый - что может вызвать проблемы позже. Я бы предпочел избежать возможности и просто сделать новую. Там чище.

Сокеты TCP содержат состояние LOT, некоторые из которых специфичны для реализации и отрабатываются из сети.

-121--3302908-

malloc () и связанные с ним функции являются единственной игрой в городе. Вы можете, конечно, катать свою собственную систему управления памятью любым способом.

-121--2138783-

Обычно malloc () реализуется в Unix с помощью sbrk () или mmap () . (Если вы используете последнее, вы хотите использовать флаг MAP _ ANON .)

Если вы нацелены на Windows, может помочь VirtureAlloc . (Более или менее функционально эквивалентно анонимному mmap () .)

Update: Не знал, что вы работаете не под полной ОС, у меня как-то сложилось впечатление, что это может быть домашнее задание, выполняющееся поверх системы Unix или что-то такое...

Если вы выполняете встроенную работу и у вас нет malloc () , я думаю, что вы должны найти некоторый диапазон памяти, на который можно писать, и написать свой собственный malloc () . Или возьмите чужой.

В основном стандартный, который все заимствуют, был написан Даг Леа в SUNY Oswego . Например, malloc glibc основан на этом. См. разделы malloc.c , malloc.h .

18
ответ дан 29 November 2019 в 20:35
поделиться

Если ваша среда выполнения не поддерживает malloc, вы можете найти malloc с открытым исходным кодом и настроить его для управления куском памяти самостоятельно.

4
ответ дан 29 November 2019 в 20:35
поделиться

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

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

3
ответ дан 29 November 2019 в 20:35
поделиться

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

Существует множество способов отслеживания того, что выделено, а что нет (растровые изображения, используемые/свободные связные списки, двоичные деревья и т.д.). Вы сможете найти множество ссылок с помощью нескольких вариантов поиска в Google.

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

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

3
ответ дан 29 November 2019 в 20:35
поделиться

Возможно, вас заинтересует: liballoc

Это простая и легко реализуемая замена malloc / free / calloc / realloc, которая работает .

Если вы заранее знаете или можете определить доступные области памяти на вашем устройстве, вы также можете использовать их libbmmm для управления этими большими блоками памяти и обеспечения резервного хранилища для liballoc. Они лицензированы BSD и бесплатны.

0
ответ дан 29 November 2019 в 20:35
поделиться

Если есть проблемы с выделением динамической памяти из кучи, вы можете попробовать выделить память из стека с помощью alloca (). Применяются обычные предостережения:

  • Когда вы вернетесь, память исчезнет.
  • Объем памяти, который вы можете выделить, зависит от максимального размера вашего стека.
0
ответ дан 29 November 2019 в 20:35
поделиться

Напишите свой. Поскольку ваш распределитель, вероятно, будет специализирован для нескольких типов объектов, я рекомендую схему Quick Fit , разработанную Биллом Вульфом и Чарльзом Вайнстоком. (Мне не удалось найти бесплатную копию этой статьи, но многие люди имеют доступ к цифровой библиотеке ACM.) Статья короткая, легко читаемая и хорошо подходит для решения вашей проблемы.

Если вам понадобится более общий распределитель, лучшее руководство, которое я нашел по теме программирования на машинах с фиксированной памятью, - это книга Дональда Кнута Искусство компьютерного программирования , том 1. Если Если вам нужны примеры, вы можете найти хорошие в эпической книге Дона об исходном коде TeX TeX: The Program .

Наконец, учебник для студентов Брайанта и О'Халларона довольно дорогой, но в нем подробно описывается реализация malloc .

3
ответ дан 29 November 2019 в 20:35
поделиться

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

​​Например, мой друг написал что-то вроде видеоигры, которая отображала v ideo в строках развертки на экран. Эта команда определила, что память будет выделена для каждой строки сканирования, но было определенное ограничение на количество байтов, которое могло быть для каждой данной сцены. После рендеринга каждой строки сканирования все временные объекты, выделенные во время рендеринга, были освобождены.

Чтобы избежать утечки памяти и из соображений производительности (это было в 90-х годах, и тогда компьютеры были медленнее), они использовали следующий подход: они заранее выделили буфер, который был достаточно большим, чтобы удовлетворить все распределения для строка развертки в соответствии с параметрами сцены, которые определяют максимальный необходимый размер. В начале каждой строки развертки глобальный указатель устанавливался на начало строки развертки. Когда каждый объект был выделен из этого буфера, было возвращено значение глобального указателя, и указатель был продвинут на следующую позицию, выровненную по машинному слову, после выделенного количества байтов. (Это выравнивание было включено в исходный расчет размера буфера, и в 90-х годах было четыре байта, но теперь должно быть 16 байтов на некоторых машинах.) В конце каждой строки сканирования глобальный указатель сбрасывался в начало буфер.

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

Буфер памяти строк развертки можно назвать «пулом» или «ареной» в зависимости от того, кого вы спросите. Важная деталь заключается в том, что это очень простая структура данных, которая управляет памятью для определенной задачи. Это не общий менеджер памяти (или, точнее, «реализация свободного хранилища»), такой как malloc , который может быть тем, о чем вы просите.

Вашему приложению может потребоваться другая структура данных для отслеживания вашего бесплатного хранилища.Какое у вас приложение?

3
ответ дан 29 November 2019 в 20:35
поделиться

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

1
ответ дан 29 November 2019 в 20:35
поделиться
4
ответ дан 29 November 2019 в 20:35
поделиться

FreeRTOS содержит 3 примера реализации распределения памяти (включая malloc () ) для достижения различных оптимизаций и вариантов использования, подходящих для небольших встроенных систем (AVR, ARM и т. Д.). См. руководство FreeRTOS для получения дополнительной информации.

Я не вижу порта для MPC555, но адаптировать код под свои нужды не составит труда.

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

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