C++--简单实现定长内存池

news2024/11/15 8:51:01

1.什么是定长内存池

        在C/C++中,动态申请内存都是通过malloc来申请的,但是实际上不是是直接从堆上直接申请的内存,而是通过malloc动态申请一大块内存,malloc就相当于一块内存池,然后分给程序使用,如果申请的内存使用完或者不够需要申请的内存超过当前剩余的内存的时候,再去向操作系统申请内存。

        内存池主要解决的是在动态申请内存的时候,解决效率的问题,当然,还可以解决一些内存碎片化问题。

        定长内存池就是通过malloc向操作系统申请一大块内存,然后分给需要使用的程序使用。用完之后还给内存池的行为。但是,功能单一,只能解决定长的内存需求,另外占着内存没有释放。
其基本结构如下:

#pragma once
#include <iostream>
#include <vector>
#include <time.h>

using std::cout;
using std::cin;
using std::endl;

namespace sss
{
	template<class T>
	class Objectpool
	{
	public:
		T* New()//开辟大小
		{
			T* obj = nullptr;
			//内存重复利用
			if (_freeleft)
			{
				void* next = *(void**)_freeleft;
				obj = (T*)_freeleft;
				_freeleft = next;
			}
			//开辟空间
			else if (_reminBytes <sizeof(T))
			{
				_reminBytes = 128 * 1024;
				_memory = (char*)malloc(_reminBytes);
				if (_memory == nullptr)//判断是否为空
				{
					throw std::bad_alloc();//抛异常
				}
			}

			obj = (T*)_memory;
			size_t objSize = sizeof(T) < sizeof(void*) 
                             ? sizeof(void*) : sizeof(T);
            //保证在32位或64位下性能正常使用,因为一个指针最小为4字节

			_memory += sizeof(T);//往后加内存
			_reminBytes -= sizeof(T);//剩余内存
			//定位new;

			new(obj)T;//调用T的构造函数

			return obj;

		}

		void Delete(T* obj)//释放内存
		{
			obj->~T();
			/*if (_freeleft == nullptr)
			{
				_freeleft = obj;
				obj = nullptr;
			}*/
			//头插
			*(void**)obj =_freeleft;//32位64位都可以运行
			_freeleft = obj;
		}
	private:
		char* _memory;//开辟的大小
		size_t _reminBytes=0;//剩余的大小
		void* _freeleft;//
	};
}

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

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

相关文章

网络安全进阶学习第十六课——业务逻辑漏洞介绍

文章目录 一、什么是业务逻辑二、业务逻辑漏洞的成因三、逻辑漏洞的重要性四、业务逻辑漏洞分类五、业务逻辑漏洞——业务授权安全1、未授权访问2、越权访问1) 平行越权&#xff08;水平越权是指相同权限的不同用户可以互相访问&#xff09;2) 垂直越权&#xff08;垂直越权是指…

企业架构LNMP学习笔记47

企业架构队列缓存中间件分布式redis&#xff1a; 一直想学习下这块的。今天总算学到了&#xff0c;好好把redis的这块内容理解下。 1&#xff09;能够描述Redis作用及其业务适用场景 &#xff1b; 2&#xff09;能够安装配置启动Redis&#xff1b; 3&#xff09;能够使用命令…

Qt使用注意事项

1.菜单选项不能出现数字&#xff0c;可以是 英文 加 “_”&#xff1a; 2.如何确保加载的图片&#xff0c;尺寸大小与原来一样&#xff1f; 【QT】添加图片资源并使用QImage加载图片显示_qimage显示图片_李春港的博客-CSDN博客 ui->PicLabel->setPixmap(QPixmap::fromIm…

(9.8-9.14)【大数据新闻速递】

加gzh“大数据食铁兽”&#xff0c;了解更多大数据快讯 【2023百度十大科技前沿发明】 近日&#xff0c;百度发布了“2023百度十大科技前沿发明”&#xff0c;包括“基于大模型的检索生成决策交互一体的智能系统”“基于大模型的端到端搜索技术”“飞桨端到端自适应的分布式训…

网络工程师的甩锅指南,果断收藏

大家好&#xff0c;我是老杨。 都说IT行业最容易被甩锅的就是网工&#xff0c;这是有科学依据的&#xff0c;比如&#xff1a; 纵观我网工群的群友聊天&#xff0c;“锅”不离口&#xff0c;很难不说明一点什么问题。 遇到甩锅&#xff0c;我相信没有哪位朋友的心情是愉悦的。…

父子工程搭建

1. 构建父工程 父工程的职责是对依赖包的版本进行管理&#xff0c;创建父工程分两步&#xff0c;第一创建父工程&#xff0c;第二在pom.xml编辑依赖管理。 进入新建模块界面&#xff0c;选择Spring Initializr&#xff0c;填写模块的信息&#xff1a; 创建成功&#xff0c;删…

linux服务器内服务访问域名Name or service not know

目录 linux服务器内服务访问域名Name or service not know 1.前言2.排查是不是这个域名无法访问2.1服务内ping 这个域名2.2在浏览器打开这个域名2.3服务内ping 这个域名所对应的ip2.4在服务器内配置host 总结参考 文章所属专区 项目问题解决 1.前言 linux服务器内服务访问域名…

许可分析 license分析 第五章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证自动化管理&#xff1a;考虑使用自…

飞驰的高铁-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第150讲。 飞驰的高铁&#xff0c;本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编程第2题&#…

字节、京东等大厂年薪50w的测试都什么水平?

各位做测试的朋友&#xff0c;但凡经历过几次面试&#xff0c;那么你一定曾被问到过以下问题&#xff1a; 1、在Linux环境下&#xff0c;怎么执行web自动化测试&#xff1f; 2、Shell如何&#xff0c;Docker熟悉吗&#xff1f; 3、全链路的压测实操过吗&#xff0c;如何推进与开…

hexo搭建一个自己的博客

hexo腾讯云服务器搭建一个自己的博客 我的博客: http://www.elcarimqaq.top/ 前期准备 node.js&#xff1a; https://nodejs.org/en/ git&#xff1a;https://git-scm.com/download/win hexo官方文档&#xff1a;https://hexo.io/zh-cn/docs/index.html 安装hexo npm ins…

“存量竞争” 体验为王,火山引擎边缘云助力内容社区破局

今年4月&#xff0c;在宣布要技术升级、数据重构后&#xff0c;承载无数人青春的天涯社区疑似关停&#xff0c;一代传奇的衰落为所有内容社区释放出了不可忽视的信号。 图片来源&#xff1a;天涯官博 回顾天涯社区发展史&#xff0c;从“周公子大战易烨卿”、天涯十大诡异事件&…

“批量文件改名:将日语文件名翻译成中文,轻松管理你的文件!

如果你经常处理各种文件&#xff0c;可能有时候会遇到一些以日语命名的文件。这时候&#xff0c;为了更好地管理和查找文件&#xff0c;你可能需要将这些日语文件名翻译成中文。那么&#xff0c;如何实现批量将日语文件名翻译成中文呢&#xff1f; 首先&#xff0c;第一步进入…

对抗生成网络总结

对一些基本的对抗生成网络的总结。部分内容整理自Teeyohuang’s blog 文章目录 GAN (NeurIPS, 2014)CGANDCGANStackGANPix2Pix (CVPR, 2017)CycleGAN (ICCV, 2017)SRGAN (CVPR, 2017)StyleGAN (CVPR, 2019) GAN (NeurIPS, 2014) Generative adversarial nets m i n G m a x D …

有关‘全局唯一id‘

UUID和Snowflake的对比 当需保证全局唯一的id&#xff0c;可以选用UUID或Snowflake(及其变种) 其中UUID 不依赖于任何第三方系统&#xff0c;性能和可用性上较好&#xff1b; Snowflake生成的id具有单调递增性&#xff08;可以拿到生成时的时间戳信息&#xff09;&#xff0c;能…

深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数

在MySQL数据库中&#xff0c;JSON格式的数据处理已经变得越来越常见。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数&#xff0c;其中两个关键的函数是…

HTML中name和class,id的区别和联系

在HTML中&#xff0c;name、class和id是用于标识和选择元素的属性。 区别&#xff1a; name属性&#xff1a;用于标识表单元素&#xff0c;特别是在提交表单时&#xff0c;用于识别表单数据。name属性可以在同一表单中的多个元素中重复使用。class属性&#xff1a;用于为一个…

品牌出海推广策略:海外网红营销和TikTok挑战赛的完美结合

随着全球化的深入&#xff0c;越来越多的品牌意识到在海外市场的存在至关重要。然而&#xff0c;进入国际市场并建立品牌知名度是一项复杂的任务&#xff0c;需要创新和多样化的策略。在这个数字化时代&#xff0c;品牌出海推广策略的一个令人兴奋的新趋势是将海外网红营销与Ti…

前端JavaScript Error 类: 异常处理与错误管理

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. Error 类简介 2. Error 类属性 3. Error 类的 API 4. Error 类的应用场景 5. 自定义错误类型 6. 注意…

如何在微软Edge浏览器上一键观看高清视频?

编者按&#xff1a;视频是当下最流行的媒体形式之一。但由于视频压缩、网络不稳定等原因&#xff0c;我们常常可以看到互联网上的很多视频其画面质量并不理想&#xff0c;尤其是在浏览器端&#xff0c;这极大地影响了观看体验。不过&#xff0c;近期微软 Edge 浏览器推出了一项…