Що стосується блоків фіксованого розміру, то, що ви описали, - це безкоштовний список . Це дуже поширена методика із наступним поворотом: список вільних блоків зберігається у самих вільних блоках. У коді C це виглядатиме так:
static void *alloc_ptr = START_OF_BIG_SEGMENT;
static void *free_list_head = NULL;
static void *
allocate(void)
{
void *x;
if (free_list_head == NULL) {
x = alloc_ptr;
alloc_ptr = (char *)alloc_ptr + SIZE_OF_BLOCK;
} else {
x = free_list_head;
free_list_head = *(void **)free_list_head;
}
return x;
}
static void
release(void *x)
{
*(void **)x = free_list_head;
free_list_head = x;
}
Це добре працює, доки всі виділені блоки мають однаковий розмір, і цей розмір кратний розміру вказівника, щоб зберегти вирівнювання. Розподіл та делокація - це постійний час (тобто такий же постійний час, як доступ до пам'яті та елементарні доповнення - у сучасному комп’ютері доступ до пам'яті може залучати пропуски кеш-пам'яті та навіть віртуальної пам'яті, отже, доступ до диска, тому "постійний час" може бути досить великим). Немає накладних витрат на пам'ять (немає додаткових покажчиків на блок або подібні речі; виділені блоки є суміжними). Крім того, покажчик розподілу досягає заданої точки лише в тому випадку, якщо свого часу потрібно було виділити багато блоків: оскільки при виділенні віддається перевага за допомогою вільного списку, покажчик розподілу збільшується лише у тому випадку, якщо простір під поточним вказівником заповнений тактовою. У цьому сенсі техніка.
Зменшуєтьсявказівник на розподіл після випуску може бути складнішим, оскільки вільні блоки можна надійно ідентифікувати лише шляхом слідування вільного списку, який проходить через них у непередбачуваному порядку. Якщо зменшення розміру великого сегмента, коли це можливо, для вас важливо, ви можете скористатися альтернативною технікою з більшими накладними витратами: між будь-якими двома виділеними блоками ви помістите «дірку». Дірки пов'язані разом із подвійно пов'язаним списком у порядку пам'яті. Вам потрібен формат даних для отвору, щоб ви могли знайти адресу початкової дірки, знаючи, де вона закінчується, а також розмір отвору, якщо ви знаєте, звідки починається отвір у пам'яті. Потім, звільняючи блок, ви створюєте дірку, яку ви з’єднуєте з наступною та попередньою дірками, відтворюючи (все ще в постійному часі) упорядкований список усіх дірок. Потім накладні дані - це приблизно два слова розміром указівника на виділений блок; але, за ціною, ви можете надійно виявити виникнення "остаточного отвору", тобто приводу зменшити розмір великого сегмента.
Можливих варіацій багато. Хорошим вступним документом є розподіл динамічного зберігання: опитування та критичний огляд Wilson et al.