c语言手撕内存池组件

news2024/11/16 21:47:49

内存池是什么?

        内存池(Memory Pool)是一种内存管理技术,它预先分配一大块内存,然后将其分成多个固定大小的小块。这些小块被组织起来,用于程序在运行期间频繁进行的内存分配和释放操作。内存池通过创建一个“池子”来管理这些小块,以便在需要时快速分配和回收内存,而不需要每次都调用系统的内存分配函数(如 malloc()free())。

        内存池的基本概念是分配一次,重复使用。通过预先分配一大块内存,程序可以在需要时从这个预先分配的内存中快速获取内存块,并在不使用时归还给池子,从而减少频繁的分配和释放操作。
 

使用内存池有什么好处?

  1. 提高性能

            系统的内存分配函数(如 malloc() 和 free())在操作系统级别会涉及复杂的管理操作,尤其是在高频率分配和释放内存时,开销可能很大。
            内存池通过提前分配和复用内存块,减少了频繁的系统调用,从而显著提高性能。特别是在实时系统或需要处理大量小对象的系统中,内存池的性能提升尤为显著。 
  2. 减少内存碎片

            当使用系统的内存分配函数时,如果程序频繁分配和释放不同大小的内存块,可能会导致内存碎片化,即分散的小块可用内存,无法被有效利用。

            内存池通常管理的是大小固定的内存块,因此不会产生内存碎片问题。
  3. 防止内存泄漏

            在某些情况下,内存池可以帮助减少内存泄漏的风险。因为内存池的内存块是固定的,开发者不需要担心忘记释放特定的内存块,只需要在适当的时候释放整个内存池。

        在不同的业务场景下内存池通常也都不一样,在初学内存池阶段,我们实现一个固定块的内存池(在内存池里分配大小一样的小块)。下边是实现过程:

 

        如果释放某个内存块以后,我们下一个可以分配的内存块应该指向刚刚释放的那个内存块,问题是怎么找到它呢?可以通过二级指针实现链表,使每个小内存块的前边存放下一个可以分配的内存块的地址。

函数实现:



#include <stdio.h>
#include <stdlib.h>

// 8K的大小
#define MEM_PAGE_SIZE		8192

typedef struct mempool_s {
    int block_size;//固定小内存块的大小
    int free_count;//内存池中还能分配的内存块的数量 剩余还有多少块

    char *free_ptr;//下一个内存块可以分配的地址
    char *mem;//指向分配的内存池的起始地址  指向整块内存
} mempool_t;

//内存池初始化
int mp_init(mempool_t *m, int size) {

	if (!m) return -1;
	if (size < 16) size = 16;

	m->block_size = size;

        m->mem = (char *)malloc(MEM_PAGE_SIZE);//分配整块内存
	if (!m->mem) return -1;
	m->free_ptr = m->mem;
        m->free_count = MEM_PAGE_SIZE / size; //能够分配固定快的大小

	int i = 0;
        //二级指针实现单项链表
	char *ptr = m->free_ptr;
	for (i = 0;i < m->free_count;i ++) {
		*(char **)ptr = ptr + size;
		ptr += size;
	}
	*(char **)ptr = NULL;

	return 0;
}

//内存池销毁
void mp_dest(mempool_t *m) {
	if (!m || !m->mem) return ;
	
	free(m->mem);

}


//分配
void *mp_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 mp_free(mempool_t *m, void *ptr) {

	*(char **)ptr = m->free_ptr;
	m->free_ptr = (char *)ptr;
	m->free_count ++;
}


int main() {

	mempool_t m;

        //分配大小为64字节的固定块
        mp_init(&m, 64);

	void *p1 = mp_alloc(&m);
	printf("1: mp_alloc: %p\n", p1);

	void *p2 = mp_alloc(&m);
	printf("2: mp_alloc: %p\n", p2);

	void *p3 = mp_alloc(&m);
	printf("3: mp_alloc: %p\n", p3);

	void *p4 = mp_alloc(&m);
	printf("4: mp_alloc: %p\n", p4);

	mp_free(&m, p2);

	void *p5 = mp_alloc(&m);
	printf("5: mp_alloc: %p\n", p5);
	

	return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精选10个热门目标检测数据集

目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一&#xff0c;也是近年来研究数量以及应用范围较为广泛的一个领域。在对自动化…

出海快报 | 爆款休闲手游半年爆增3倍,《无尽冬日》海外版累计收入破10亿美元

TopOn出海快报栏目为互联网出海从业者梳理每周出海热点&#xff0c;最值得关注的 Top 5 出海新闻&#xff0c;供大家了解行业最新发展态势。 SLG超级爆款《无尽冬日》海外版累计收入破10亿美元 手游市场分析公司Sensor Tower最近发文称&#xff0c;《Whiteout Survival》累计&a…

2024年【茶艺师(高级)】考试资料及茶艺师(高级)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 茶艺师&#xff08;高级&#xff09;考试资料考前必练&#xff01;安全生产模拟考试一点通每个月更新茶艺师&#xff08;高级&#xff09;考试总结题目及答案&#xff01;多做几遍&#xff0c;其实通过茶艺师&#xf…

怎么做二维码预览文件?文件长期扫码展示的制作技巧怎么做二维码预览文件?文件长期扫码展示的制作技巧

在日常生活中每天都会接触不同类型的文件&#xff0c;想要快速将文件与其他人共享&#xff0c;可以将文件生成二维码&#xff0c;让其他人通过扫码来预览或者下载文件。二维码的优势在于能够长期存储文件&#xff0c;简化其他人获取文件的流程&#xff0c;而且能够随时替换文件…

美业系统哪个好用?美业SAAS系统管理系统收银系统怎么选择?

当选择美业收银系系统管理系统时&#xff0c;有几个关键因素需要考虑&#xff1a; • 功能全面性&#xff1a; 确保系统能够满足您店铺的所有需求&#xff0c;包括但不限于预约管理、客户关系管理、库存管理、员工排班、销售报表等。您需要评估系统是否提供了您所需的所有功能…

Simple Calculator(简单计算器:算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

负载均衡--相关面试题(六)

在负载均衡的面试中&#xff0c;可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答&#xff1a; 一、什么是负载均衡&#xff1f; 回答&#xff1a;负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源…

微服务SpringSession解析部署使用全流程

1、SpringSession简介 是SpringCloud下管理session的框架&#xff0c;在微服务架构中&#xff0c;由于应用了分布式的思想&#xff0c;session无法做到内存中互通&#xff0c;需要一个框架来实现各个微服务中session数据共享&#xff0c;SpringSession解决了这个问题。 在Spr…

信息技术网络安全政策制定

为什么要制定网络安全政策&#xff1f; 通常&#xff0c;公司并不认为需要制定网络安全政策。现有的政策是为了保护公司的资产&#xff0c;而数据也是一项资产。 网络安全政策的真正必要性很简单&#xff1a;网络安全并不像锁门或不偷公司笔那么简单。在许多情况下&#xff0…

【Gitee自动化测试3】Git的本地使用,连接推送至Gitee上的仓库中

一. 创建版本库 存放项目&#xff0c;项目的删除更改&#xff0c;版本库都能够监控。 创建一个文件夹&#xff08;不要包含中文路径&#xff09;&#xff0c;右键选择Git Bash Here&#xff08;打开Git终端&#xff09; 输入git init 对文件夹进行版本库的初始化&#xff0c;…

汽车信息安全 -- 存到HSM中的密钥还需包裹吗?

目录 1.车规芯片的ROM_KEY 2.密钥加密与包裹 3.瑞萨RZ\T2M的密钥导入 4.小结 在车控类ECU中&#xff0c;我们通常把主控芯片MCU中的HSM以及HSM固件统一看做整个系统安全架构的信任根。 所以大家默认在HSM内部存储的数据等都是可信的&#xff0c;例如CycurHSM方案中使用HSM…

Win11家庭版升级专业版

参考&#xff1a; 小白升级--Win11家庭版到专业版_windows11家庭版升级专业版 csdn 82xm6-CSDN博客https://blog.csdn.net/weixin_45877306/article/details/136423462 这里&#xff0c;我步骤更简单点。 密钥&#xff1a;82XM6-23JJG-44W4Q-W3QPQ-V9FY4 到这里 等待就好。 …

Techub专访顾荣辉教授:解密CertiK的安全战略路线

当 Web3 安全审计公司还在争抢审计份额时&#xff0c;CertiK 已经开始将目光瞄准即将进军 Web3 的传统商业巨头。CertiK 不仅在传统行业进行白帽行动获得如苹果公司的官方感谢&#xff0c;还是 Web3 行业唯一一家拥有 SOC 2 和 ISO 认证的 Web3 的安全公司。基于此&#xff0c;…

APP集成人脸识别接口-C#人脸识别API接口

人脸识别技术是一种基于生物特征的识别技术&#xff0c;它通过捕捉和分析人脸特征来识别或验证个体身份。这项技术主要依赖于计算机视觉、图像处理和人工智能算法的结合&#xff0c;一般由第三方人工智能接口平台来提供&#xff0c;例如&#xff1a;翔云、阿里云等平台。 人脸识…

MySql在更新操作时引入“两阶段提交”的必要性

日志模块有两个redo log和binlog&#xff0c;redo log 是引擎层的日志&#xff08;负责存储相关的事&#xff09;&#xff0c;binlog是在Server层&#xff0c;主要做MySQL共嗯那个层面的事情。redo log就像一个缓冲区&#xff0c;可以让当更新操作的时候先放redo log中&#xf…

选择更轻松:山海鲸可视化与PowerBI的深度对比

在数据分析与可视化的时代&#xff0c;选择合适的报表工具显得尤为重要。山海鲸可视化和PowerBI是市场上颇受欢迎的两款免费报表软件&#xff0c;各有特色。接下来&#xff0c;我们将从功能、优缺点等方面进行对比&#xff0c;帮助你找到最适合的工具。 山海鲸可视化 山海鲸可…

台式机通过笔记本上网

概述: ①将wifi共享给网口 ②网口配置成自协商IP和DNS即可 一、背景 由于台式机只有网口&#xff0c;没得wifi网卡&#xff0c;因此想通过笔记本连wifi,再通过网线将笔记本和台式机连接起来&#xff0c;从而实现台式机通过笔记本的wifi上网&#xff0c;即让笔记本当台式机的…

闭环Token的创新机遇:如何通过控制和定制Token使用提升应用价值

闭环token&#xff08;Closed-Loop Tokens&#xff0c;简称CLTs&#xff09;允许在Sui上创建具有定义规则和限制的token&#xff0c;从而实现闭环token系统的创建。与Sui的Coin标准不同&#xff0c;后者允许无限制的使用和转移&#xff0c;而CLTs提供了一种更可控和可定制的方法…

梦到去世的亲人、朋友,多半是这三种暗示!

原创 国学君 国学人生 2024年09月27日 06:00 浙江 梦境一直是人类探索自我内心、情感和潜意识的神秘窗口。 尤其是梦到已故的亲人或朋友&#xff0c;这种情景不仅让人感到惊讶&#xff0c;更引发了深刻的思考。 在这些梦中&#xff0c;往往蕴含着重要的暗示。 本文将探讨梦…

傅里叶变换(对称美)

傅里叶变换&#xff08;对称美&#xff09; 冲浪时发现的有趣文章&#xff0c;学习自https://zhuanlan.zhihu.com/p/718139299 摘下来的内容&#xff1a; 傅里叶变换之所以“怪美的嘞”&#xff0c;根本在于它有一种内在的对称性&#xff0c;这一点在上面的图并没有表现出来…