news 2026/2/4 0:56:24

内存池详解和实现

作者头像

张小明

前端开发工程师

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/1/29 21:59:18

2026 年招聘效率提升重点:AI 简历解析赋能智能化招聘工具的实践

在企业招聘过程中&#xff0c;HR 常被海量简历筛选占据大量时间&#xff0c;人工提取信息不仅效率低&#xff0c;还易遗漏关键内容&#xff0c;导致招聘周期延长。而智能化招聘工具的核心优势之一&#xff0c;便是通过 AI 简历解析技术改变这一现状。本文将从 AI 简历解析的基础…

作者头像 李华
网站建设 2026/1/30 4:53:44

如何高效进行<|关键词|>:实用文献查找方法与技巧指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

作者头像 李华
网站建设 2026/1/31 8:42:26

15|写在最后:交付不是打打杀杀,而是长期主义

如果把交付理解成“项目收尾的人”&#xff0c; 那可能都会觉得这个岗位委屈、被动、吃力不讨好。 但如果站在行业与组织结构的高度看&#xff0c; 会发现&#xff1a; 交付&#xff0c;其实是整个商业系统里&#xff0c;最接近“现实真相”的角色之一。一、为什么“交付”这个…

作者头像 李华
网站建设 2026/2/3 16:04:59

XAudio2_6.dll文件丢失找不到问题 免费下载方法分享

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

作者头像 李华
网站建设 2026/2/1 18:15:05

基于大数据+Hadoop+Hive的抖音用户行为分析系统设计与实现开题报告

基于大数据HadoopHive的抖音用户行为分析系统设计与实现开题报告 一、课题背景 在数字化时代浪潮下&#xff0c;短视频行业凭借碎片化、娱乐化、互动性强的特性迅速崛起&#xff0c;成为互联网用户日常娱乐与信息获取的核心渠道。抖音作为国内短视频领域的标杆平台&#xff0c;…

作者头像 李华
网站建设 2026/2/1 4:00:33

英文文献的研读与分析方法探讨

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

作者头像 李华