Библиотека распределителя иерархической памяти для C ++
-
08-07-2019 - |
Вопрос
Мое приложение в основном организовано в слоях , поэтому я обнаружил, что-то вроде Пулы памяти APR - лучший способ.
При чтении на SO о размещении C ++ новых
сообщений здесь & amp; здесь и более общий вопрос распределения C Я думал о ручном создании распределителя иерархического пула, как было предложено в одном посте, но в чистой нью-йоркской традиции сначала я спрашиваю, существует ли что-то подобное.
Он также может обладать хорошим свойством возможности возвращать неиспользуемую память для ОС (поскольку выделение может быть выполнено с помощью mmap (MAP_ANON)
) или может быть выделение из стека в соответствии с предложением Ferrucico здесь . р>
Решение
Я знаю другой хороший иерархический распределитель памяти, но он вызывает malloc
под крышками.
talloc - это распределитель памяти на основе иерархического пула с деструкторами. Это основной распределитель памяти, используемый в Samba4, который имеет огромное значение во многих аспектах разработки Samba4.
Чтобы начать работу с talloc, я бы рекомендовал вам прочитать руководство talloc . . р>
Тем не менее, malloc
в Glibc уже использует mmap (MAP_ANON)
для выделения, превышающего mmap_threshold
, которое вы можете установить с помощью mallopt (M_MMAP_THRESHOLD, байты)
. По умолчанию он динамически настраивается между
/*
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, или имеет какие-либо гарантии совместимости.
Другие советы
У интерфейсов и реализаций C C Дейва Хэнсона есть тщательно настроенный распределитель для одного пула. , Вы можете связать их вместе, чтобы создать иерархический распределитель, который был бы проще, чем сворачивать свой собственный с нуля.
У вас есть результаты профилирования, которые показывают, что управление памятью является существенным узким местом, верно? Или вы просто пытаетесь упростить API для распределения? Р>