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

 更新时间:2023年03月01日 11:20:57   作者:牵着我的猪去看海  
这篇文章主要为大家详细介绍了C++中的基本组件——内存池的相关知识,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下

内存池概念

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++ 内存池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中如何通过指针参数返回值

    C语言中如何通过指针参数返回值

    这篇文章主要介绍了C语言中如何通过指针参数返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言内存对齐实例详解

    C语言内存对齐实例详解

    这篇文章主要介绍了C语言内存对齐,包括内存对其的基本概念及用法,以及注意事项,并以实例形式加以说明,需要的朋友可以参考下
    2014-09-09
  • 关于在C程序中处理UTF-8文本的方法详解

    关于在C程序中处理UTF-8文本的方法详解

    这篇文章主要给大家介绍了关于在C程序中处理UTF-8文本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-11-11
  • C++深度优先搜索的实现方法

    C++深度优先搜索的实现方法

    这篇文章主要介绍了C++深度优先搜索的实现方法,是数据结构中非常重要的一种算法,需要的朋友可以参考下
    2014-08-08
  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言用函数指针实现计算器的方法,需要的朋友可以参考下
    2022-07-07
  • C++ deque与vector对比的优缺点

    C++ deque与vector对比的优缺点

    这篇文章主要介绍了C++中deque与vector相比的优势与劣势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程

    在Visual Studio中用C++语言创建DLL动态链接库图文教程

    这篇文章主要介绍了在Visual Studio中用C++语言创建DLL动态链接库图文教程,本文详细讲解了DLL库的创建过程,并给出了代码示例,需要的朋友可以参考下
    2014-09-09
  • C语言通讯录管理系统课程设计

    C语言通讯录管理系统课程设计

    这篇文章主要为大家详细介绍了C语言通讯录管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言自定义数据类型的结构体、枚举和联合详解

    C语言自定义数据类型的结构体、枚举和联合详解

    这篇文章主要给大家介绍了关于C语言自定义数据类型的结构体、枚举和联合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 链接库动态链接库详细介绍

    链接库动态链接库详细介绍

    静态链接库.lib和动态链接库.dll。其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射
    2012-11-11

最新评论