Создать распределитель:
Распределитель создается с множеством страниц памяти, каждый из которых имеет одинаковый размер (512 КБ, 256 КБ, размер должен быть настроен для вашего использования).
В первый раз, когда объект запрашивает у этого распределителя память, он выделяет страницу. Выделение страницы состоит из удаления ее из свободного списка (без поиска, все страницы имеют одинаковый размер) и установки размера объектов, которые будут размещены на этой странице. Обычно этот размер вычисляется путем взятия запрошенного размера и округления его до ближайшей степени 2. Последующие выделения того же размера просто требуют небольшого количества математических указателей и увеличения числа объектов на странице.
Фрагментация предотвращается, потому что все слоты имеют одинаковый размер и могут быть пополнены при последующих распределениях. Эффективность поддерживается (в некоторых случаях повышается), поскольку в каждом выделении нет memheader (что имеет большое значение, когда выделения небольшие, когда выделения становятся большими, этот распределитель начинает тратить почти 50% доступной памяти).
Как распределение, так и освобождение могут быть выполнены за постоянное время (нет поиска в свободном списке для правильных интервалов). Единственная сложность в освобождении состоит в том, что вам обычно не нужен заголовок памяти, предшествующий выделению, поэтому вам нужно самим определить страницу и индекс на странице ... Это суббота, и я не выпил кофе, поэтому я у меня нет хороших советов по этому поводу, хотя достаточно легко разобраться по освобожденному адресу.
Редактировать: Этот ответ немного затянутый. Как обычно повышение имеет вашу спину.