bialand
> про настоящие аллокаторы
Что такое настоящие?
Тебе надо-то просто класс, раздающий указатели. Начни со стекового аллокатора, там вообще один указатель достаточно хранить, если без проверок. Пул делается тоже без запар, не имеет ограничения на порядок освобождения, но работает лишь с одинаковым размером блоков, при этом за О(1). Потом объедини несколько пулов, каждый под свою степень двойки (запрашиваемый размер тупо округляй под степень).
Если тебе уперлось "перевыделять", то на уровне, на котором работает malloc, дельного решения нет, потому что задача абсурдная.
Либо ничего не "перевыделяешь", просто не используешь память, которую ты за каким-то хреном выделил, а потом она оказалась не нужна, либо юзаешь обертку, которая сама перевыделяет, (контейнер, например) и ей идентифицируешь данные, а не сырым указателем, либо аллокатор не будет универсальным.
Для средних и больших блоков можно заюзать buddy hеap, она может переаллоцировать, бо так устроена, но у ней в принципе внутренняя фрагментация по степеням двойки, т.е при уменьшении 1.5 раза она ничего не освободит, от 2 и более. Но она на уровне malloca сразу отжирает столько, что это - не realloc. Системную память она не отдаст.
Для маленьких блоков твоя затея безумна, потому что их, наоборот, так или иначе заранее выделяют, и там любая хочушка чревата диким оверхедом, т.е никто не трахает систему просто потому, что у кого-то в жопе горит "а у меня тут целых 200 байт лежат и не используется".
1 frag / 2 deaths
> Потом объедини несколько пулов, каждый под свою степень двойки (запрашиваемый
> размер тупо округляй под степень).
Херовая идея. Сколько это выжрет тупо при попытке выделить 3 блока: 128M, 256М, 512M? Я к тому, что делать пулы для больших блоков вообще смысла нет, а для средних - затрахаешься настраивать, чтобы и выжирало приемлемо, и не дрочило память настолько часто, что это уже не пул, а тот же самый malloc.
beejah
> Сколько это выжрет тупо при попытке выделить 3 блока: 128M, 256М, 512M?
Нафит столько О_о, у меня 64 мега на всё хватает.
beejah
> Сколько это выжрет тупо
Почитай про TLSF, идея легко развивается до (2^n)*(4+0,1,2,3), там тоже конечный набор размеров, но градаций чуть больше.
1 frag / 2 deaths
> TLSF
Ну, там двухуровневое выделение. Т.е это совсем не "объедени несколько пулов".
1 frag / 2 deaths
> Нафит столько О_о, у меня 64 мега на всё хватает.
Окай. 8М, 16М, 32М.
beejah
> Т.е это совсем не "объедени несколько пулов".
Совсем да, ну это вопрос терминологии. Не надо пулы делать как изолированные участки памяти, надо их именно объединить, чтобы участок памяти был один на всех, и для всех память выделять именно из него.
1 frag / 2 deaths
Так в пулы у тебя с запасом выделяется. Т.е, как минимум, страницами подсасывается, иначе это уже не пул.
Но не суть, это, видимо, действительно вопрос терминологии.
Тема в архиве.