Краткий ответ: если вы не хотите существовать malloc
, вам нужно внедрить свой собственный менеджер кучи .
Менеджер кучи, например malloc
в glibc ofLinux, HeapAlloc
в Windows, является алгоритмом пользовательского уровня.Во-первых, имейте в виду, что куча оптимизирована для размещения объектов небольшого размера, таких как 4 ~ 512 байт.
Как реализовать свой собственный менеджер кучи?По крайней мере, вы должны вызвать системный API, который выделяет кусок памяти в вашем процессе.Есть VirtualAlloc
для Windows и sbrk
для Linux.Эти API-интерфейсы выделяют большой кусок памяти, но размер должен быть кратным page size.Как правило, размер страницы в x86 и Windows / Linux составляет 4 КБ.
После получения части страницы вам необходимо реализовать свои собственные алгоритмы, позволяющие разделить эту большую память на меньшие запросы.Классическая (все еще очень практичная) реализация и алгоритм: dlmalloc
: http://g.oswego.edu/dl/html/malloc.html
Для реализации необходимо иметь несколько структур данных для бухгалтерского учета и несколько политик для оптимизации.Например, для небольших объектов, таких как 16, 20, 36, 256 байт, менеджер кучи поддерживает список блоков каждого размера.Итак, есть список списков.Если запрашиваемый размер больше, чем размер страницы, он просто вызывает VirtualAlloc
или sbrk
.Однако эффективная реализация очень сложна.Вы должны учитывать не только скорость и затраты пространства, но также локальность и фрагментацию кэша.
Если вас интересуют диспетчеры кучи, оптимизированные для многопоточной среды, посмотрите tcmalloc
: http://goog -perftools.sourceforge.net/doc/tcmalloc.html