2009-05-07 6 views
2

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

Во время чтения на SO около C++ placement new сообщений here & here и a more generic C allocation question я думал о колдовании иерархического бассейна аллокатора как предложено в одном посте, но в чистой NYI традиции я первый спрашивать, если что-то подобное уже существует.

Это также может иметь хорошее свойство быть в состоянии вернуть неиспользуемую память для ОС (поскольку распределение может быть сделано с mmap(MAP_ANON)) или может быть allocating from the stack как предложено Ferrucicohere.

+1

Давайте попробуем что-нибудь. Является ли распределение памяти узким местом в вашем приложении, которое было доказано путем профилирования? Если нет, зачем беспокоиться о пользовательских распределителях? – lothar

+0

Иерархические пулы памяти помогают также с правильностью, поскольку вы устраняете один источник утечек памяти. – florin

+0

@florin Если вы правильно используете C++ (контейнеры, raii, ...), вероятность наличия утечек действительно низкая. Я даже не могу вспомнить, когда мне пришлось отслеживать последнюю утечку. Это уже давно. – lothar

ответ

5

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

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

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

Это, как говорится, Glibc-х malloc уже использует 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 или имеет гарантии совместимости.

+0

sizeof (talloc_chunk) составляет 88 байт (2.0.8). каждый лист в иерархической структуре имеет вес 88 байт. это невозможно. – puchu

2

Dave Hanson's C Interfaces and Implementations имеет тщательно настроенный распределитель с одним пулом. Вы могли бы связать их вместе, чтобы создать иерархический распределитель, который был бы проще, чем перенос с нуля.

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

+0

Ваша вторая предпосылка правильная, я просто стараюсь иметь лучший API, чем ручной дизайн анонимных mmaps. –

+0

ОК, в этом случае мне очень нравится API Hanson --- стоит проверить. –