关于内存缓存池的理解

版权声明: 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);  //超出了缓存池内存重新分配
}

猜你喜欢

转载自blog.csdn.net/qq_28710983/article/details/82263424
今日推荐