Библиотека распределителя иерархической памяти для C ++ - PullRequest
2 голосов
/ 07 мая 2009

Мое приложение в основном организовано в слоях , поэтому я обнаружил, что что-то вроде пулов памяти APR будет лучшим способом.

Читая на SO о C++ placement new сообщениях здесь & здесь и более общего вопроса распределения C Я думал о ручном создании иерархической Распределитель пула, как предлагается в одном посте, но по чистой нью-йоркской традиции Сначала я спрашиваю, существует ли что-то подобное.

Он также может обладать прекрасным свойством возвращать неиспользуемую память ОС (поскольку выделение может быть выполнено с помощью mmap(MAP_ANON)) или может выделяться из стека , как предлагалось Ferrucico здесь .

Ответы [ 2 ]

5 голосов
/ 07 мая 2009

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

talloc - это распределитель памяти на основе иерархического пула с деструкторами. Это основной распределитель памяти, используемый в Samba4, который имеет огромное значение во многих аспектах разработки Samba4.

Чтобы начать работу с talloc, я бы рекомендовал вам прочитать руководство talloc .

При этом malloc в Glibc уже использует mmap(MAP_ANON) для распределения, превышающего mmap_threshold, которое вы можете установить с помощью mallopt(M_MMAP_THRESHOLD, bytes). По умолчанию он динамически регулируется между

/*
  MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
  adjusted MMAP_THRESHOLD.
*/

#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif

#ifndef DEFAULT_MMAP_THRESHOLD_MAX
  /* For 32-bit platforms we cannot increase the maximum mmap
     threshold much because it is also the minimum value for the
     maximum heap size and its alignment.  Going above 512k (i.e., 1M
     for new heaps) wastes too much address space.  */
# if __WORDSIZE == 32
#  define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
#  define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif

Остерегайтесь, если вы опустите его; по умолчанию не более #define DEFAULT_MMAP_MAX 65536 штук будет выделено с помощью mmap. Это можно изменить с помощью mallopt(M_MMAP_MAX, count), но при использовании многих mmap s накладные расходы.

Переменные среды MALLOC_MMAP_THRESHOLD_ и т. Д. Также устанавливают эти параметры.

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

2 голосов
/ 08 мая 2009

Интерфейсы и реализации C Дейва Хэнсона имеет тщательно настроенный распределитель для одного пула. Вы можете связать их вместе, чтобы создать иерархический распределитель, который был бы проще, чем свертывать свой собственный с нуля.

Вы делаете результаты профилирования, которые показывают, что управление памятью является существенным узким местом, верно? Или вы просто пытаетесь упростить API для распределения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...