场景分析"/>
3.1.2 内存池的实现与场景分析
1.避免频繁分配/释放内存(产生大量的内存碎片)
分配固定大小:
#define MEM_PAGE_SIZE 0x1000typedef 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);}
更多推荐
3.1.2 内存池的实现与场景分析
发布评论