版权声明: https://blog.csdn.net/qq_28710983/article/details/82263424
首先理解一点
cache_allocer结构体里面的free_list只是一个指针,保存的是当前空闲的内存的地址,node结构体里面有一个node指针,node和node里面的指针是两个指针变量,free_list里面保存的是 一个node 结构体, node结构体里面又保存着node结构体,所以free_list就会形成一个链子,把内存池的每一个地址,串联起来,当前位置的free_list就是下一个准备用的内存块的地址
0 <- 123 <- 133 <- 143 <-153 ,free_list的最终结构将是这样,如果一个内存块地址是10个大小,0就是链子的尾部
struct node {
struct node* next;
};
struct cache_allocer {
unsigned char* cache_mem;
int capacity;
struct node* free_list;
int elem_size;
};
struct cache_allocer* create_cache_allocer(int capacity, int elem_size) {
struct cache_allocer* allocer = malloc(sizeof(struct cache_allocer));
memset(allocer, 0, sizeof(struct cache_allocer));
elem_size = (elem_size < sizeof(struct node)) ? sizeof(struct node) : elem_size;
allocer->capacity = capacity;
allocer->elem_size = elem_size;
allocer->cache_mem = malloc(capacity * elem_size);
memset(allocer->cache_mem, 0, capacity * elem_size);
allocer->free_list = NULL;
for (int i = 0; i < capacity; i++) {
struct node* walk = (struct node*)(allocer->cache_mem + i * elem_size);
walk->next = allocer->free_list;
allocer->free_list = walk;
}
return allocer;
}
void* cache_alloc(struct cache_allocer* allocer, int elem_size) {
if (allocer->elem_size < elem_size) {
return NULL;
}
if (allocer->free_list != NULL) {
void* now = allocer->free_list;
allocer->free_list = allocer->free_list->next;
return now;
}
return malloc(elem_size); //超出了缓存池内存重新分配
}