C++ 内存管理----内存池

本文探讨了C++内存管理中的内存池技术,包括为何需要内存池、内存池的概念、如何创建内存池以及boost::pool和SGI STL内存池的改进版本。内存池通过预先分配和管理内存,提高了内存申请和释放的效率,减少了内存碎片,但可能导致内存占用只增不减。同时,文章提到了内存池与线程的关系,并推荐了相关阅读资料。
摘要由CSDN通过智能技术生成

很多内容来自于互联网,如有侵权,请告知。
另外,从网站 http://cplusplus.wikidot.com/cn:dive-into-memory-pool收获很多,在此表示感谢。

为什么需要内存池

我们写程序经常需要 malloc 和 new 一块内存出来, 这些内存是在堆上进行分配的,在堆上分配的内存和在栈上分配的内存不同,可以长久的保存。

堆是什么: 可以把你的进程空间 想象成 4G 大小的内存(32 为机子上): 0~ 4GB。 而堆是 其中间的一块连续的内存区域。 程序员知道 这块内存区域的起始位置结束位置,并且这块连续的内存区域可以被程序员随意使用,并且这块区域是很大的。
推荐文章:What and where are the stack and heap?

堆是一块 连续的 内存区域,是用来保存数据的。

我们为什么会需要对堆 进行管理呢?

因为堆是一块很大的空间。 可以在程序执行过程中随时使用。 但是在程序执行过程中,当我们需要数据的时候,我们将会从堆上申请内存。

那么问题来了: 当我们想要从堆上申请内存的时候,从堆上的哪里取出需要的内存块呢?
因为有些地方已经可能被别的数据所占用了,我们需要记录这些信息,当申请内存的时候,可以得到一块有用的内存

如何堆堆进行管理呢?

很简单,我们只需要两张表就可以了。 第一张表记录了哪些内存块被使用了,称为alloc_list。 第二张表记录了哪些内存块未被使用,称为 free_list。 当需要申请内存的时候,从第二张表中查询 找到满足要求的内存块,并且将此内存块 从 free_list 中删除,加入到 alloc_list中。释放的时候同样如此。

这种管理内存的方式有什么缺点呢?

因为我们申请的内存块 大小 不定,申请和释放时间也不相同。 所以 这个堆 (连续的整个内存块) 会形成 零零散散的情况(称为内存碎片)。 并且 查询这两张表 需要时间,所以如果申请和释放堆内存比较频繁的话,会比较浪费时间。
总之,缺点就是 时间和空间消耗严重

这种管理方式的优点呢?

通用。
因为你可以申请任意大小的内存。

那么为什么 需要 内存池呢?

节省 时间 和空间。
比如一种情形,你现在需要 对某种块

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值