простой c malloc - PullRequest
       1

простой c malloc

13 голосов
/ 20 сентября 2010

Хотя существует множество различных сложных реализаций malloc / free для C / C ++, я ищу действительно простую (особенно) небольшую, которая работает с буфером фиксированного размера и поддерживает * 1003.*.Потокобезопасность и т. Д. Не нужны, а мои объекты маленькие и не сильно различаются по размеру.Есть ли реализация, которую вы могли бы порекомендовать?

EDIT :

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

Поскольку все, похоже, рекомендуют стандартную malloc, я, возможно, должен переформулировать свой вопрос.Что мне нужно, так это «простейшая» реализация malloc поверх буфера, которую я могу начать оптимизировать для своих собственных нужд.Возможно, первоначальный вопрос был неясен, потому что я не ищу оптимизированный malloc, а только простой.Я не хочу начинать с glibc-malloc и расширять его, но с более легкого.

Ответы [ 7 ]

26 голосов
/ 20 сентября 2010

Кернингхан и Ричи, кажется, предоставили небольшой malloc / free в своей книге C - это именно то, что я искал (переопределение найдено здесь) . Я только добавлю простой realloc.

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

17 голосов
/ 20 сентября 2010

Я рекомендую ту, которая входит в стандартную библиотеку, прилагаемую к вашему компилятору.

Следует также отметить, что не существует легального способа переопределить malloc / free

4 голосов
/ 20 сентября 2010

malloc / free / realloc, поставляемые с вашим компилятором, почти наверняка лучше, чем некоторые функции, которые вы собираетесь подключить.

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

3 голосов
/ 20 сентября 2010

Мне кажется, что вы ищете пул памяти. Apache Runtime Library имеет довольно неплохую библиотеку и кроссплатформенную.

Возможно, она не совсем легкая, но исходный код открыт и вы можете его изменить.

2 голосов
/ 20 сентября 2010

В CCAN :

есть относительно простая реализация пула памяти.

http://ccodearchive.net/info/antithread/alloc.html

Это похоже на ваш счет. Конечно, alloc.c - это 1230 строк, но хорошей частью этого является тестовый код и манипулирование списками. Это немного сложнее, чем код, который вы реализовали, но приличное распределение памяти сложно.

2 голосов
/ 20 сентября 2010

Я бы вообще не изобретал колесо с функциями распределения , если мой шаблон использования памяти либо не поддерживается malloc / etc. Память или может быть разделена на одну или несколько предварительно выделенных зон, каждая из которых содержит одну или две кучи LIFO (при освобождении любого объекта освобождаются все объекты в той же куче, которые были выделены после него). В обычной версии последнего сценария единственный раз, когда что-либо освобождается, все освобождается; в таком случае malloc () может быть с пользой переписан как:

char *malloc_ptr;
void *malloc(int size)
{
  void *ret;
  ret = (void*)malloc_ptr;
  malloc_ptr += size;
  return ret;
}

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

1 голос
/ 20 сентября 2010

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

...