返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++基本组件之内存池详解
  • 758
分享到

C++基本组件之内存池详解

C++基本组件内存池C++内存池 2023-03-01 11:03:54 758人浏览 薄情痞子
摘要

内存池概念 1:尽量减少malloc的次数 2:频繁申请小块内存空间都造成空间的极大浪费 3:利用new和delete运算符重载,替代系统调用 4:减少malloc的次数,可在一定程

内存池概念

1:尽量减少malloc的次数

2:频繁申请小块内存空间都造成空间的极大浪费

3:利用new和delete运算符重载,替代系统调用

4:减少malloc的次数,可在一定程度上提高效率

5:用malloc申请一个大块内存,从一大块内存中,一点点分配给用户

6:当一大块快用光了,再申请一大块


#include <iOStream>
#include <malloc.h>
#include <time.h>
using namespace std;
namespace _nm1
{
	//内存池
	//减少malloc的次数,减少对内存的浪费
	//尤其是频繁地申请小块内存
	//速度和效率的提升并不是特别明显,因为malloc的速度也不慢
	//用malloc申请
	//一个大块内存,从一大块内存中,一点点分配给用户
	//当一大块快用光了,再申请一大块
	class A
	{
	public:
		static void *operator new(size_t size);
		//静态成员函数,属于类,不属于对象
		static void operator delete(void *phead);
		static int m_iCout;//分配计数统计
		static int m_iMallocCount;//malloc次数统计
	private:
		A *next;//指针域,指向下一个空间
		static A* m_FreePosi;//总是指向一块分配出去的内存首地址
		static int m_sTrunkCout;//一次分配多少倍
	};
	int A::m_iCout = 0;//初始化
	int A::m_iMallocCount = 0;


	A *A::m_FreePosi = nullptr;
	int A::m_sTrunkCout = 5;//一次分配五倍
	void * A::operator new(size_t size)
	{
		//核心实现代码
		A* templink;
		if (m_FreePosi == nullptr)
		{
			//待分配内存为空时
			size_t realsize = m_sTrunkCout*size;//一次五倍
			m_FreePosi = reinterpret_cast<A*>(new char[realsize]);
			//一次向系统要5倍的类A字节数大小,不是递归,系统new
			templink = m_FreePosi;
			//将分配出来的内存,彼此之间链表串起来
			for (; templink != &m_FreePosi[m_sTrunkCout - 1]; ++templink)
			{
				//链到最后一个节点空间,结束
				templink->next = templink + 1;
			}
			templink->next = nullptr;
			++m_iMallocCount;//统计次数
		}
		templink = m_FreePosi;
		m_FreePosi = m_FreePosi->next;
		//既然已经将templink成功返回回去了,就指向下一个能用的内存块
		++m_iCout;
		return templink;//返回能有的下一块内存

	}
	void A::operator delete(void * phead)
	{
		(static_cast<A*>(phead)->next) = m_FreePosi;
		//将当前要释放的节点指针,指向我下一个空闲块
		m_FreePosi = static_cast<A*>(phead);//始终指向下一个能分配的内存块
		//将m_FreePosi可用空闲块的指针,直接指向了当前要释放的节点
		//意味着后面来申请了,可以直接将这块空间覆盖
		//前面Phead->next已经指向了下一个空闲块,所以m_FreePosi可以直接next到
	}
	void func()
	{
		//测试代码
		clock_t start, end;
		start = clock();
		for (int i = 0; i < 500; i++)
		{
			A *pa = new A();//重载了new
		}
		end = clock();
		cout << "申请分配内存的次数" << A::m_iMallocCount << endl;
		cout << end - start << endl;//测试内存池所用时间
	}
	
	void func1()
	{
		//测试代码
		clock_t start, end;
		start = clock();
		for (int i = 0; i < 5000000; i++)
		{
			A *pa = ::new A();//重载了new
		}
		end = clock();
		
		cout << end - start << endl;//测试普通new所用时间
	}
}
int main()
{
	//_nm::func();
	_nm1::func();
	_nm1::func1();
	getchar();
}

到此这篇关于c++基本组件之内存池详解的文章就介绍到这了,更多相关C++ 内存池内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++基本组件之内存池详解

本文链接: https://lsjlt.com/news/198002.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++基本组件之内存池详解
    内存池概念 1:尽量减少malloc的次数 2:频繁申请小块内存空间都造成空间的极大浪费 3:利用new和delete运算符重载,替代系统调用 4:减少malloc的次数,可在一定程...
    99+
    2023-03-01
    C++ 基本组件 内存池 C++ 内存池
  • C++基本组件之内存池的概念是什么
    这篇文章主要介绍了C++基本组件之内存池的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++基本组件之内存池的概念是什么文章都会有所收获,下面我们一起来看看吧。内存池概念尽量减少malloc的次数频...
    99+
    2023-07-05
  • C++手写内存池的案例详解
    引言 使用new expression为类的多个实例分配动态内存时,cookie导致内存利用率可能不高,此时我们通过实现类的内存池来降低overhead。从不成熟到巧妙优化的内存池,...
    99+
    2024-04-02
  • C++如何实现定长内存池详解
    目录1. 池化技术2. 内存池概念2.1 内存碎片3. 实现定长内存池3.1 定位new表达式(placement-new)3.2 完整实现总结1. 池化技术 池是在计算机技术中经...
    99+
    2024-04-02
  • C++内存管理之简易内存池的实现
    目录什么是内存池?它的实现过程为:初步实现使用嵌入指针改进更简化:static allocatormacor for static allocator什么是内存池? 频繁的调用 ma...
    99+
    2024-04-02
  • C++中高性能内存池的实现详解
    目录一、概述二、主函数设计三、模板链表栈四、设计内存池五、实现六、与 std::vector 的性能对比总结一、概述 在 C/C++ 中,内存管理是一个非常棘手的问题,我们在编写一个...
    99+
    2022-11-13
    C++高性能内存池 C++ 内存池
  • Java基础详解之内存泄漏
    目录一、什么是内存泄漏二、Java内存泄漏引起的原因三、内存泄漏的危害一、什么是内存泄漏 内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对...
    99+
    2024-04-02
  • C++之内存泄漏排查详解
    目录一 、经验排查二 、使用Visual Leak Detector for Visual C++2.1 Visual Leak Detector for Visual C++简介2...
    99+
    2024-04-02
  • C++入门之内存处理详解
    目录前言C/C++内存分布c语言中动态内存管理方式C++内存管理方式new和delete操作基础类型new和delete操作自定义类型基于malloc开辟并初始化的自定义类...
    99+
    2024-04-02
  • C++内存池两种方案解析
    目录C++内存池1、C++内存池分析2、多此一举方案3、分时复用改进方案4、其他的思考C++内存池 前言: 使用new expression为类的多个实例分配动态内存时,cookie...
    99+
    2024-04-02
  • C++中内存池的简单原理及实现详解
    目录为什么要用内存池内存池原理内存池设计内存池实现为什么要用内存池 C++程序默认的内存管理(new,delete,malloc,free)会频繁地在堆上分配和释放内存,导致性能的损...
    99+
    2023-03-01
    C++内存池原理 C++实现内存池 C++内存池
  • Flutter本地存储之基本的键值对存储详解
    目录前言基本使用存储其他类型数据总结前言 在原生的 Android 或 iOS 中,都提供了基本的键值对存储方式,Android 是 SharedPreferences,iOS 是 ...
    99+
    2023-03-21
    Flutter键值存储 Flutter 存储
  • C++核心编程之内存分区详解
    目录1、内存分区模型:2、代码区:3、全局区:4、小结:5、代码演示:6、运行结果:总结1、内存分区模型: C++程序在执行时,将内存大方向划分成4个区域 (1)代码区:存放安徽念书...
    99+
    2024-04-02
  • 详解C语言之动态内存管理
    目录开辟动态内存的函数释放开辟的动态内存空间的函数错误信息函数具体使用例: 常见的动态内存错误总结先来了解一下动态管理内存所需用到的函数 开辟动态内存的函数 1.mallo...
    99+
    2024-04-02
  • Android Jetpack组件ViewModel基本用法详解
    目录引言一、概述与作用二、基本用法小结引言 天道好轮回,终于星期五,但是还是忙碌了一天。在项目中,我遇到了一个问题,起因则是无法实时去获取信息来更新UI界面,因为我需要知道我是否获...
    99+
    2023-01-30
    Android Jetpack组件ViewModel Android Jetpack
  • 详解C/C++内存管理
    目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理方式new和delete操作内置类型new和delete操作自定义类型operator new和operator d...
    99+
    2024-04-02
  • Java基础之内存泄漏与溢出详解
    目录一、浅析二、Java内存泄露三、Java内存溢出一、浅析 内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟...
    99+
    2024-04-02
  • Java基本语法之内部类示例详解
    目录1.内部类概念及分类2.实例内部类2.1实例内部类的创建2.2使用.this和.new2.3内部类实现迭代打印2.4内部类的继承3.静态内部类4.匿名内部类1.内部类概念及分类 ...
    99+
    2024-04-02
  • 详解利用C语言如何实现简单的内存池
    前言 在编程过程中,尤其是对于C语言开发者,其实编程就是在使用内存,不停地变化内存中的数据。当我们想开辟一片新的内存使用时,就会使用malloc实现。但是通过查阅很多资料,发现频繁的...
    99+
    2024-04-02
  • Android组件ViewStub基本使用方法详解
    ViewStub可以在运行时动态的添加布局。帮助文档给定的定义是: "A ViewStub is an invisible, zero-sized View that can ...
    99+
    2022-06-06
    方法 viewstub Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作