c++内存池的设计和实现_c++程序设计

c++内存池的设计和实现_c++程序设计内存池的介绍与经典实现在做项目时,学习另一个新的知识点内存池。于是就想着记录一下。说明:本篇文章转载自腾讯云开发者社区:内存池的介绍与经典实现1.默认内存管理函数的不足:利用默认的内存管理函数new/delete和malloc/

内存池的介绍与经典实现   在做项目时,学习另一个新的知识点内存池。于是就想着记录一下。说明:本篇文章转载自腾讯云开发者社区:内存池的介绍与经典实现   1.默认内存管理函数的不足:   利用默认的内存管理函数new/delete和malloc/free在堆上分配和释放内存时都会有一些额外的开销。   系统在收到分配一定大小内存的请求时,会根据一定的算法(分配最先找到的不小于请求大小的内存块,或者分配最适用于请求大小的内存给请求者,或者分配最大的空闲块)找到合适的内存空闲块,如果该空闲块过大,还要切割成更小的内存块,然后系统更新内存链表,完成一次内存分配操作。   另外,如果实在多线程的操作下,每一次的内存分配还需要加锁,同样会增加开销。频繁的分配和释放内存都会增加系统的开销。   2.内存池的简介:   2.1 定义:内存池(Memory Pool )是一种内存分配方式。使用new/delete和malloc/free来分配内存会产生很多的内存碎片,导致性能降低。   2.2 内存池的优点:   内存池是在真正使用内存之前分配一定数量的、大小相等的内存块留作备用。当有新的内存请求时,就从内存池中分配一块内存块,若内存块不够则继续申请新的内存块。   2.3 内存池的分类:   单就从线程安全角度来看,可以分为单线程内存池和多线程内存池。单线程内存池整个生命周期只有一个线程在访问,因此不需要考虑内互斥的问题。多线程内存池,在访问时有可能被多个线程共享,因此在访问时需要加锁。   2.4 经典内存池的设计   1.先申请一块连续的内存空间,该段内存空间能够容纳一定数量的对象。   2.每个对象连同指向下一个对象的指针一起构成一个内存结点(Memory Node)。各个空闲的内存结点通过指针来构成一个内存结点链表,链表的每一个结点都是一块可供分配的内存空间。   3.某个结点一旦分配出去就链表中删除。   4.一旦释放了该节点,就又从该节点加入到自由空闲结点连链表中。   5.如果一个内存块的被全部分配完了,并且有新的内存分配申请,则再次申请一个新的内存块,并且将该内存块添加到内存块链表中。   上述描述的大致过程如下图:   
在这里插入图片描述   如上图所示:浅蓝色代表申请的内存块,蓝色代表内存结点,一个内存块包含有3个内存结点,内存结点由链表管理,如果分配出去则将其从链表中删除。如果释放将其添加回链表的头部。   3.经典内存池的数据结构设计   内存池模板类应该是如下设计:   两个常量:   内存块大小:MemBlockSize;   结点大小:ItemSize;   两个指针变量:   内存块链表头指针:pMemBlockHeader;   空闲内存结头链表头指针:pFreeNodeHeader;   空闲结点结构体:   内存块结构体:   经典内存池的实现如下:   MemPool.h文件   MemPool.cpp文件   上面的程序裕兴结果如下:
在这里插入图片描述   说明:如结果所示:在分配完p2时释放p1,然后再次为p1分配内存时,这个新的内存恰好是上一次释放的内存。如果把它p1改成p3,则p3的地址和p1原来的地址相同。上面结果中p3的地址是新分配的内存块中的地址。   欢迎大家一起交流学习.   参考:   内存池介绍与经典内存池的实现

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/27074.html

(0)
上一篇 2024年 9月 13日 上午10:39
下一篇 2024年 9月 13日

相关推荐

关注微信