Вопрос

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

РЕДАКТИРОВАТЬ:

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

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

Это было полезно?

Решение

Kerninghan & Ritchie, похоже, предоставили небольшой Malloc / бесплатно в своей книге C - именно то, что я искал (Reimplementation, найденный здесь). Отказ Я добавлю только простой Realloc.

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

Другие советы

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

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

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

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

Звучит мне, что вы ищете пул памяти. То Apache Runtime Библиотека Имеет довольно хороший, и это тоже кроссплатформа.

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

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

char * malloc_ptr; void * malloc (int размер) {void * ret; RET = (void *) malloc_ptr; malloc_ptr + = размер; Возврат RET; }

Нулевые байты накладных расходов на выделенный объект. Пример сценария, в котором пользовательский менеджер памяти был использован для сценария, где Malloc () было недостаточно, было приложением, когда тестовые записи переменной длины произведены записи результатов переменной длины (которые могут быть длиннее или короче); Приложение, необходимое для поддержки результатов получения и добавления большего количества тестов MID-Batch. Испытания были сохранены при увеличении адресов, начиная с нижней части буфера, в то время как результаты хранятся при уменьшении адресов, начиная с вершины. В качестве фоновой задачи тесты после текущего будет скопированы в начало буфера (поскольку был только один указатель, который использовался для чтения тестов для обработки, логика копирования будет обновлять этот указатель по мере необходимости). Приложение использовало Malloc / Free, возможно, возможно, что чередование ассигнований для испытаний и результатов может иметь фрагменту памяти, но с использованием системы не было такого риска.

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

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

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

Сначала повторяйте рекомендации по измерению и специализируются только в том случае, если производительность отстой - должно быть легко абстрактно, что ваш Malloc / Free / Reallocs, таким образом, что замена проста.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top