Dengan blok ukuran tetap, apa yang telah Anda gambarkan adalah daftar gratis . Ini adalah teknik yang sangat umum, dengan twist berikut: daftar blok gratis disimpan di blok gratis sendiri. Dalam kode C, akan terlihat seperti ini:
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;
}
Ini bekerja dengan baik selama semua blok yang dialokasikan memiliki ukuran yang sama, dan ukuran itu adalah kelipatan dari ukuran pointer, sehingga pelurusan dipertahankan. Alokasi dan deallokasi adalah waktu-konstan (yaitu, sebagai waktu-konstan ketika akses memori dan penambahan-penambahan elementer - dalam komputer modern, akses memori dapat melibatkan kehilangan cache dan bahkan memori virtual, karenanya disk mengakses, sehingga "waktu konstan" bisa sangat besar). Tidak ada memori overhead (tidak ada pointer per-blok tambahan atau hal-hal seperti itu; blok yang dialokasikan berdekatan). Juga, penunjuk alokasi mencapai titik tertentu hanya jika, pada satu waktu, bahwa banyak blok harus dialokasikan: karena alokasi lebih suka menggunakan daftar bebas, penunjuk alokasi ditingkatkan hanya jika ruang di bawah penunjuk saat ini adalah jam penuh. Dalam pengertian itu, teknik.
Menurunpenunjuk alokasi setelah rilis dapat menjadi lebih kompleks, karena blok gratis hanya dapat diidentifikasi secara andal dengan mengikuti daftar gratis, yang melewati mereka dalam urutan yang tidak terduga. Jika mengurangi ukuran segmen besar bila mungkin penting bagi Anda, Anda dapat menggunakan teknik alternatif, dengan overhead yang lebih banyak: di antara dua blok yang dialokasikan, Anda meletakkan "lubang". Lubang-lubang tersebut dihubungkan bersama dengan daftar yang terhubung ganda, dalam urutan memori. Anda memerlukan format data untuk lubang sehingga Anda dapat menemukan alamat mulai lubang dengan mengetahui di mana ujungnya, dan juga ukuran lubang jika Anda tahu di mana lubang dimulai di memori. Kemudian, ketika Anda melepaskan blok, Anda membuat lubang yang Anda gabungkan dengan lubang berikutnya dan sebelumnya, membangun kembali (masih dalam waktu yang konstan) daftar semua lubang yang dipesan. Overhead kemudian sekitar dua kata berukuran pointer per blok yang dialokasikan; tetapi, pada harga itu, Anda dapat dengan andal mendeteksi terjadinya "lubang terakhir", yaitu kesempatan untuk mengurangi ukuran segmen besar.
Ada banyak variasi yang memungkinkan. Makalah pengantar yang baik adalah Dynamic Storage Allocation: A Survey and Critical Review oleh Wilson et al.