news 2026/3/29 21:35:41

内存池详解和实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内存池详解和实现

内存池

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不大的情况下。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 11:06:41

XXE(XML外部实体注入)基础与文件读取

第一部分&#xff1a;开篇明义 —— 定义、价值与目标 定位与价值 在Web安全攻防的版图中&#xff0c;XXE&#xff08;XML External Entity Injection&#xff0c;XML外部实体注入&#xff09; 是一种常被低估却危害深远的安全漏洞。它并非源于复杂的逻辑缺陷&#xff0c;而是…

作者头像 李华
网站建设 2026/3/30 6:37:05

启动游戏出现找不到xinput1_3.dll文件问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/3/28 19:54:19

计算机毕业设计springboot“茶文化”网站 基于 SpringBoot 的“茶韵雅集”在线文化平台 融合 SpringBoot 的“茗香知味”茶文化传播系统

计算机毕业设计springboot“茶文化”网站2p9kxpza &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。茶&#xff0c;这片源于东方的树叶&#xff0c;早已超出饮品范畴&#xff0c;成…

作者头像 李华