Запрос на пулы памяти в C ++ - PullRequest
1 голос
/ 16 января 2012

Можно ли создать реализацию пула памяти, которая следует простой логике:

1 - выделить n байтов из пула памяти.

2 - использовать измененный new (); Функция / оператор, который не выделяет память, получает только указатель на начало пула памяти. Таким образом, объекты создаются динамически без накладных расходов.

3 - Когда пул памяти заканчивается, он освобождает то, что от него осталось, и выделяет новый пул памяти

4 - объекты, созданные в первом пуле памяти, оставляются для выбора памяти в зависимости от их размеров. Разница между тем, что было выделено в первом пуле, и тем, что было возвращено при его истощении, восстанавливается объектами после их удаления.

В основном меня беспокоит тот факт, что я понятия не имею, как удалить пул памяти, меньший, чем он был выделен, помня о том, что помимо того, что осталось в конце объекта пула памяти, есть также заголовок ОС для пул памяти, который находится перед первым объектом, выделенным в пуле. Какой подход мне нужен, чтобы убедиться, что нет утечки памяти, что удаление избыточного пула памяти не приведет к удалению объектов, выделенных в нем, и что заголовок для фрагмента пула памяти будет безопасно удален.

Спасибо!

РЕДАКТИРОВАТЬ: обратите внимание, что целью является выделение памяти пулом памяти и освобождение объектами, которые могут иметь различное время жизни. Если это вообще возможно ...

1 Ответ

3 голосов
/ 16 января 2012

Во-первых, это звучит как распределитель арены (как упомянуто в комментариях), если вы хотите знать, что вы должны искать.

Обратите внимание, что арены действительно полезны, только если вы планируете разрушатьвсе сразу;если вы ожидаете вернуть память из удаленных объектов для повторного использования, вы в конечном итоге создадите свою собственную кучу, расположенную на вершине арены.Если вы просто хотите сохранить кусок арены до тех пор, пока не будет освобожден последний объект, вы можете справиться с помощью refcount.

Во-вторых, единственный известный мне способ выделить память, который вы можете позже сжать, не перемещая(как realloc), использует карты памяти: это зависит от платформы.

...