news 2026/4/18 13:17:07

内存池详解和实现

作者头像

张小明

前端开发工程师

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/4/16 12:46:05

提示词工程vs上下文工程:AI交互方法论全解析(值得收藏)

本文探讨了从提示词工程到上下文技术的演进&#xff0c;分析了精简提示词设计、上下文管理的重要性及方法(压缩、结构化笔记、多智能体)。作者认为当前AI技术方案灵感源于人类认知世界的方式&#xff0c;强调应"回到事情本身"&#xff0c;围绕"人"的核心需…

作者头像 李华
网站建设 2026/4/17 23:35:57

k8s最佳实践之service端口号

我们配置不同的应用,service的端口如果相同,是否会冲突?你是不是每次配置service的时候都会有这个担心,所以每次都会针对性的设计一堆的端口号进行规划。其实大可不必这样做。 是的,在 Kubernetes(K8s)中,多个 Pod 对应的 Service 的端口号(​​port​​​ 字段)完全…

作者头像 李华
网站建设 2026/4/18 7:41:08

SQL盲注:布尔盲注、时间盲注与报错盲注

第一部分&#xff1a;开篇明义——定义、价值与目标 定位与价值 在渗透测试与Web安全的攻防棋局中&#xff0c;SQL注入&#xff08;SQLi&#xff09; 是经久不衰的“兵家必争之地”。当应用程序未能对用户输入进行充分过滤&#xff0c;导致攻击者能够干涉后端数据库查询的逻辑…

作者头像 李华