3.1.2 内存池的实现与场景分析

1.避免频繁分配/释放内存(产生大量的内存碎片)
分配固定大小:

#define MEM_PAGE_SIZE 0x1000

typedef struct mempool_s {
	int block_size;
	int free_count;

	char *free_ptr;
	char *mem;
} mempool_t;

int memp_init(mempool_t *m, int block_size) {
	if (!m) return -2;

	m->block_size = block_size;
	m->free_count = MEM_PAGE_SIZE / block_size;
	
	m->free_ptr = (char *)malloc(MEM_PAGE_SIZE);
	if (!m->free_ptr) return -1;
	m->mem = m->free_ptr;

	int i = 0;
	char *ptr = m->free_ptr;
	for (int i = 0; i < m->free_count; i++) {
		*(char**)ptr = ptr + block_size;
		ptr += block_size;
	}
	*(char **)ptr = NULL;

	return 0;
}

void *memp_alloc(mempool_t *m) {
	if (!m || m->free_count == 0) return NULL;
	void *ptr = m->free_ptr;

	m->free_ptr = *(char **)ptr;
	m->free_count--;

	return ptr;
}

void *memp_free(mempool_t *m, void *ptr) {
	*(char **)ptr = m->free_ptr;
	m->free_ptr = (char *)ptr;
	m->free_count++;
	return NULL;
}

int main()
{
	mempool_t m;
	memp_init(&m, 32);

	void *p1 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p1);

	void *p2 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p2);

	void *p3 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p3);

	void *p4 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p4);

	memp_free(&m, p1);
	memp_free(&m, p3);

	void *p5 = memp_alloc(&m);
	printf("memp_alloc p5 : %p\n", p5);

	void *p6 = memp_alloc(&m);
	printf("memp_alloc p6 : %p\n", p6);


	memp_free(&m, p1);

}

你可能感兴趣的:(零声教育,c++)