Với các khối có kích thước cố định, những gì bạn đã mô tả là một danh sách miễn phí . Đây là một kỹ thuật rất phổ biến, với vòng xoắn sau: danh sách các khối miễn phí được lưu trữ trong chính các khối miễn phí. Trong mã C, nó sẽ trông như thế này:
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;
}
Điều này hoạt động tốt miễn là tất cả các khối được phân bổ có cùng kích thước và kích thước đó là bội số của kích thước của một con trỏ, do đó sự liên kết được giữ nguyên. Phân bổ và phân bổ là thời gian không đổi (nghĩa là thời gian không đổi khi truy cập bộ nhớ và bổ sung cơ bản - trong một máy tính hiện đại, truy cập bộ nhớ có thể liên quan đến lỗi bộ nhớ cache và thậm chí cả bộ nhớ ảo, do đó "thời gian không đổi" có thể khá lớn). Không có chi phí bộ nhớ (không có con trỏ trên mỗi khối bổ sung hoặc những thứ tương tự; các khối được phân bổ liền kề nhau). Ngoài ra, con trỏ phân bổ chỉ đạt đến một điểm nhất định nếu tại một thời điểm, nhiều khối phải được phân bổ: vì phân bổ thích sử dụng danh sách miễn phí, con trỏ phân bổ chỉ tăng nếu không gian bên dưới con trỏ hiện tại đầy. Trong ý nghĩa đó, kỹ thuật.
Giảmcon trỏ phân bổ sau khi phát hành có thể phức tạp hơn, vì các khối miễn phí có thể được xác định một cách đáng tin cậy chỉ bằng cách làm theo danh sách miễn phí, đi qua chúng theo thứ tự không thể đoán trước. Nếu việc giảm kích thước phân khúc lớn khi có thể là quan trọng đối với bạn, bạn có thể muốn sử dụng một kỹ thuật thay thế, với nhiều chi phí hơn: giữa hai khối được phân bổ bất kỳ, bạn đặt một "lỗ". Các lỗ được liên kết với nhau với một danh sách liên kết đôi, theo thứ tự bộ nhớ. Bạn cần một định dạng dữ liệu cho một lỗ để bạn có thể xác định vị trí địa chỉ bắt đầu lỗ bằng cách biết nơi nó kết thúc và kích thước lỗ nếu bạn biết lỗ bắt đầu từ đâu trong bộ nhớ. Sau đó, khi bạn giải phóng một khối, bạn tạo một lỗ mà bạn hợp nhất với các lỗ tiếp theo và các lỗ trước đó, xây dựng lại (vẫn trong thời gian không đổi) danh sách theo thứ tự của tất cả các lỗ. Chi phí hoạt động sau đó là khoảng hai từ có kích thước con trỏ trên mỗi khối được phân bổ; nhưng, với mức giá đó, bạn có thể phát hiện một cách đáng tin cậy sự xuất hiện của "lỗ cuối cùng", tức là một dịp để giảm kích thước phân khúc lớn.
Có nhiều biến thể có thể. Một bài viết giới thiệu tốt là Phân bổ lưu trữ động: Một khảo sát và đánh giá quan trọng của Wilson et al.