文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++基本组件之内存池的概念是什么

2023-07-05 07:27

关注

这篇文章主要介绍了C++基本组件之内存池的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++基本组件之内存池的概念是什么文章都会有所收获,下面我们一起来看看吧。

内存池概念

尽量减少malloc的次数

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

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

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

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

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

#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字节数大小,不是递归,系统newtemplink = 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++基本组件之内存池的概念是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++基本组件之内存池的概念是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯