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

Простой c malloc

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

ИЗМЕНИТЬ

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Он может быть не совсем легким, но источник открыт, и вы можете его изменить.

Ответ 5

Я бы вообще не изобретал колесо с функциями распределения , если мой шаблон использования памяти не поддерживается 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, возможно, что чередование распределений для тестов и результатов может иметь фрагментированную память, но с используемой системой такого риска не было.

Ответ 6

Существует относительно простая реализация пула памяти в CCAN:

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

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

Ответ 7

Повторяя рекомендации для измерения сначала и только специализируясь, если производительность отстойная, должно быть легко абстрагироваться от malloc/free/reallocs, так что замена проста.

Учитывая специализированную платформу, я не могу комментировать эффективность времени выполнения. Если вы исследуете свой собственный пул объектов (см. Другие ответы) или небольшое распределение объектов a la Loki или this стоит посмотреть. Вторая ссылка содержит некоторые интересные комментарии по этой проблеме.