Một thực hiện simplist là một trong những nổi tiếng K&R C Bible, trang 186 - 188.
Khối bộ nhớ chúng ta có thực sự là hơn (một đầu struct hoặc kích thước một đầu đoàn của) so với chúng tôi áp dụng cho.Các struct có thể như thế này:
typedef long Align;
union header
{
struct
{
union header* ptr; // next block
unsigned size; // size of this block , times of head size
}s;
Align x;
};
Một con số để chứng minh điều đó:
Khi chúng ta gọi là free
chức năng, hành vi có thể là như thế này:
void free(void* ptr)
{
Header *bp, *p;
bp = (Header *)ptr - 1;
/* ..... */
/*return the memory to the linked list */
}
Trong phòng thu trực quan, chúng tôi có hai mô hình: release version
và debug version
, chúng tôi thậm chí có thể sử dụng người đứng đầu để nhắn lưu trữ debug để gỡ lỗi easier.The tiêu đề trong debug version
được gọi _CrtMemBlockHeader
, định nghĩa như sau:
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char * szFileName;
int nLine;
size_t nDataSize;
int nBlockUse;
long lRequest;
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
Sau đó lalout bộ nhớ là:
Lưu trữ kích thước ở cuối sẽ là một chiến lược không hiệu quả vô vọng. Và tôi không nghĩ về http://en.wikipedia.org/wiki/Buddy_memory_allocation là "kỳ lạ". –
Err, heh, tôi đang cố gắng nói điều gì đó hơi khác. Đã sửa! – DigitalRoss
Tôi đã thấy kỹ thuật tương tự trong nhân Linux với phân bổ bộ nhớ hạt nhân bằng cách sử dụng "struct page" được lưu trữ ở đầu vùng bộ nhớ được cấp phát và cấu trúc được sử dụng để giữ trạng thái bộ nhớ. – ArunMKumar