Реализация пулов памяти в C - PullRequest
9 голосов
/ 15 августа 2011

Я ищу хорошую реализацию пула памяти в C.

это должно включать следующее:

  1. Анти фрагментация.
  2. Будь супер быстрым:)
  3. Возможность "связать" несколько выделений разных размеров под некоторым идентификатором и удалить все выделения с заданным идентификатором.
  4. Поток безопасен

Ответы [ 4 ]

8 голосов
/ 15 августа 2011

Я думаю, что превосходный talloc, разработанный как часть самбы, может быть тем, что вы ищете.Самая интересная часть в том, что любой указатель, возвращаемый из talloc, является допустимым контекстом памяти.Их пример:

struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
// ...
talloc_free(X); // frees memory for both X and X->name

В ответ на ваши конкретные моменты:

(1) Не уверен, что такое антифрагментация в этом случае.В C вы все равно не собираетесь сокращать сборку мусора, поэтому я думаю, что ваш выбор несколько ограничен.

(2) Он рекламирует только на 4% медленнее, чем обычный malloc(3), что довольно быстро.

(3) См. Пример выше.

(4) Это потокобезопасно, если разные потоки используют разные контексты, а лежащий в основе malloc является потокобезопасным.

2 голосов
/ 15 августа 2011

Для пулов памяти, которые были тщательно опробованы и протестированы, вы можете просто использовать APR:

http://apr.apache.org/docs/apr/1.4/apr__pools_8h.html

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

2 голосов
/ 15 августа 2011

Вы изучили

Оба используют пул памяти, но сохраняют его в основном прозрачным дляПользователь.

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

0 голосов
/ 29 апреля 2015

bget - другой выбор. Он хорошо протестирован и готов к производству.

http://www.fourmilab.ch/bget/

...