杭州市网站建设_网站建设公司_表单提交_seo优化
2026/1/19 19:17:31 网站建设 项目流程

内存池

1. 定长内存池

1.0 预先分配内存池大小

// 定义内存页的大小为 4096 字节#defineMEM_PAGE_SIZE0x1000

1.1 内存池结构体

typedefstructmempool_s{//每个内存块大小intblocksize;//空闲内存块数量intfreecount;//指向空闲内存块链表的头指针char*free_ptr;//内存池的起始地址char*mem;}

1.2 创建内存池&销毁内存池

// 创建内存池// 参数: m 为指向内存池结构体的指针, block_size 为每个内存块的大小// 返回值: 成功返回 0, 失败返回 -1 或 -2intmemp_create(mempool_t*m,ibt block_size){//检查指针是否为空if(!m)return-1;//设置内存块的大小m->blocksize=block_size;//计算空闲数量(初始化的时候就是总数量)m->freecount=MEM_PAGE_SIZE/block_size//分配内存页m->mem=(char*)malloc(MEM_PAGE_SIZE);if(!m->mem){return-2;}//将内存初始化为0 每次在堆上分配空间的时候都需要清理memset(m->mem,0,MEM_PAGE_SIZE);// 空闲内存块链表的头指针指向内存池的起始地址m->free_ptr=m->mem;inti=0;char*ptr=m->mem;for(i=0;i<i<m->freecount;i++){//重点 将内存块的前四个字节存储后一个内存块的地址,进行串联*(char**)ptr=ptr+blocksize;ptr=ptr+block_size;}//最后一个置NULL*(char**)ptr=NULL;return0;}
// 销毁内存池// 参数: m 为指向内存池结构体的指针voidmemp_destory(mempool_t*m){// 检查指针是否为空if(!m)return;// 释放内存池分配的内存free(m->mem);}

1.3 内存池中内存块的分配 & 回收

内存块分配

// 从内存池中分配一个内存块// 参数: m 为指向内存池结构体的指针// 返回值: 成功返回分配的内存块的指针, 失败返回 NULLvoid*memp_alloc(mempool_t*m){//检查指针是否为空和是否还有剩余空间if(!m||m->freecount==0)returnNULL;//获取当前空闲块指针,作为返回值void*ptr=m->free_ptr;//移动指针到下一个空闲块m->free_ptr=*(char**)ptr;//取出存储信息,赋值给空闲块指针m-freecount--;returnptr;}

内存块回收

// 将内存块释放回内存池// 参数: m 为指向内存池结构体的指针, ptr 为要释放的内存块的指针voidmemp_free(mempool_t*m,void*ptr){//将释放的内存块的头指向当前空闲内存块的地址*(char**)ptr=m->free_ptr;//更新空闲指针m->free_ptr=(char*)ptr;//空闲块 +m->freecount++;}

main()函数

// 主函数, 用于测试内存池的功能intmain(){// 定义一个内存池结构体变量mempool_t m;// 创建内存池, 每个内存块大小为 32 字节memp_create(&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);// 将内存块 p2 释放回内存池memp_free(&m,p2);return0;}

总结:
这种定长的内存池,需要应用于特殊场景,比如kvstore在数据key和value不大的情况下。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询