用模版实现简单的内存池

程序中有时候会遇到这种情况,就是需要不停的去分配以及释放内存。带来的是不停的调用new以及delete带来的开销。

而且由于全局的new以及delete往往对多线程做出了并发保护,所以在单线程情况下这更带来一种浪费,一般的情况下是去实现一个

单线程的内存池来进行性能优化,配合所需的类往往带来很好的性能提升。

首先是作为内存池的模板类:

 1 template<class T>
 2 class MemoryPool{
 3 public:
 4     MemoryPool(size_t size = EXPANSION_SIZE);
 5     ~MemoryPool();
 6 
 7     //从空闲列表中分配T大小的空间
 8     inline void * alloc(size_t size);
 9 
10     //释放内存到空闲列表中
11     inline void free(void * elements);
12 private:
13     MemoryPool<T> * next;   //空闲列表的下一个元素
14     enum { EXPANSION_SIZE = 32 };
15     void expandTheFreeList(int howMany = EXPANSION_SIZE);
16 };
17 
18 template<class T>
19 MemoryPool<T>::MemoryPool(size_t size)
20 {
21     expandTheFreeList(size);
22 }
23 
24 template<class T>
25 MemoryPool<T>::~MemoryPool()
26 {
27     MemoryPool<T> * nextPtr = next;
28     if (next){
29         for (nextPtr = next; nextPtr != nullptr; nextPtr = next){
30             next = next->next;
31             delete[] ((char * )nextPtr);    //这里的强制类型转换应该注意,不转换编译无法通过的当时分配
32                                             //内存的时候是按照char类型分配的,那么释放的时候也应该同样释放。
33         }
34     }
35 }
36 
37 
38 template<class T>
39 inline
40 void * MemoryPool<T>::alloc(size_t)
41 {
42     if (!next)
43         expandTheFreeList();
44     MemoryPool<T> * head = next;
45     next = head->next;//分配了一块空间
46     return head;
47 }
48 
49 template<class T>
50 inline
51 void MemoryPool<T>::free(void * doomed)
52 {
53     MemoryPool<T> * head = static_cast<MemoryPool<T> *>(doomed);
54     head->next = next;
55     next = head;
56 }
57 
58 template<class T>
59 void MemoryPool<T>::expandTheFreeList(int howMany)
60 {
61     //保证分配的内存大小至少应该是大于指针大小或者是元素大小中的 最大者,因为二者之间是共享内存的
62     size_t sizeAlloc = (sizeof(T) > sizeof(MemoryPool<T> *)) ?
63         sizeof(T) : sizeof(MemoryPool<T> *);
64     MemoryPool<T> * runner = (MemoryPool<T>*)(new char[sizeAlloc]); //这里实际上是可以使用static_cast的,但是不知道为什么,
65     next = runner;                                              //gcc下编译不能通过。可能因为gcc的限制比较严格。无奈,只能使用普通的强制类型转换
66     for (int i = 0; i < howMany; ++i){
67         runner->next = (MemoryPool<T>*)(new char[sizeAlloc]);
68         runner = runner->next;
69     }
70     runner->next = 0;
71 }

 

下面是使用该内存池的一个rational类,代码如下:

 1 class Rational{
 2 public:
 3     Rational(int a = 0, int b = 1):n(a), d(b){}
 4     void * operator new(size_t size){return memPool->alloc(size); }
 5     void operator delete(void * doomed, size_t size){memPool->free(doomed);}
 6     static void newMemPool(){memPool = new MemoryPool<Rational>; }
 7     static void deleteMemPool()
 8     {
 9         if(!memPool)
10             return;
11         delete memPool;
12     }
13 private:
14     int n;
15     int d;
16     static MemoryPool <Rational> * memPool;
17 };

使用代码如下:

 1 MemoryPool<Rational> * Rational::memPool = 0;
 2 
 3 int main()
 4 {
 5     Rational * array[10];
 6     Rational::newMemPool();
 7     for(int j = 0; j < 2; ++j){
 8         for(int i = 0; i < 10; i++){
 9             array[i] = new Rational(i);
10         }
11         for(int i = 0; i < 10; i++){
12             delete array[i];
13         }
14     }
15     Rational::deleteMemPool();
16 }

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4950452.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress插入图片无法居中的解决方法

img.img-responsive {display: block;margin-left: auto;margin-right: auto; } 参考:https://www.22vd.com/38777.html

织梦标签大全2

系统标签&#xff1a; {dede:global.cfg_basehost/} {dede:global.cfg_webname/} {dede:global.cfg_powerby/}版权信息 {dede:field.keywords/} {dede:field.description/} {dede:global.cfg_beian/} {dede:global.cfg_templets_skin/}/style/ {dede:global.cfg_templets_skin/…

python编写脚本,删除固定用户下的所有表

脚本如下&#xff1a;[oracleycr python]$ more t_del.py #/usr/bin/python#coding:utf8import sysimport cx_Oraclei0conncx_Oracle.connect(%s/%s%s % (sys.argv[1],sys.argv[2],sys.argv[3]))cursorconn.cursor()cursor.execute(select table_name from user_tables)rowscur…

在Brackets中使用jsHint遇到的问题

在Brackets安装使用jsHint&#xff0c;但发现jsHint不生效&#xff0c;仅有Brackets自带的jsLint生效。 此时可通过修改配置文件解决&#xff0c;首先确定已经安装了jsHint&#xff0c;在右边栏点击 Extension Manager图标&#xff0c;搜索jsHint&#xff0c;安装即可。 然后点…

华为云hcip认证试题_首信AAA认证计费系统通过华为云兼容性认证,成为华为认证级ISV伙伴...

点击上方“蓝字”关注我们首信AAA认证计费系统软件3.0在2020年9月24日通过华为云Stack 6.5(鲲鹏)的兼容性测试&#xff0c;最终获得华为技术认证书及HUAWEI COMPATEBLE相关认证徽标使用权。同时&#xff0c;首信科技获得华为认证级ISV伙伴认证证书。本次获得的产品兼容性认证及…

数据格式转换(一)PDF转换技术

PDF&#xff08;Portable Document Format&#xff09;文件格式是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关&#xff0c;这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式。越来越多的电子图书、产品说明、公司文告、网络资料…

OC-成员变量的作用域

#import <Foundation/Foundation.h>interface Person : NSObject {int _no;public // 在任何地方都能直接访问对象的成员变量int _age;private // 只能在当前类的对象方法中直接访问int _height;protected // 能在当前类和子类的对象方法中直接访问、、默认是protectint…

Netty4.x中文教程系列(二) Hello World !

在中国程序界。我们都是学着Hello World !慢慢成长起来的。逐渐从一无所知到熟悉精通的。 第二章就从Hello World 开始讲述Netty的中文教程。 首先创建一个Java项目。引入一个Netty 框架的包。这个步骤我在本系列教程的后面就不在重复了。 先上一张我示例的项目工程图给大家看一…

jq金钱如何加千分位_拼多多如何玩转场景推广

首先&#xff0c;我们先弄明白拼多多场景推广的展示以及扣费规则&#xff1a;排名规则&#xff1a;综合排名商品质量分广告出价。商品质量分点击率转化率销量交易额。扣费规则&#xff1a;扣费&#xff08;下一位的出价*下一位的商品素材点击率&#xff09;/自己的商品素材点击…

硬盘安装win10,笔者教你如何一步步从硬盘安装win10系统

https://www.ghostxpsp3.net/czxtjc/12280.html 对于没有U盘系统和光驱的用户来说&#xff0c;使用硬盘安装系统&#xff0c;无疑是最好的解决方案。今天笔者教你如何一步步从硬盘安装win10系统&#xff0c;笔者教你如何一步步从硬盘安装win10系统要保证在能进入系统的前提下进…

转载: java telnet ssh 实现

原文&#xff1a;http://blog.csdn.net/Code_cj/article/details/6411682 java telnet ssh 实现 2011-05-1113:17 911人阅读 评论(1) 收藏 举报先看看telnet 和ssh的定义&#xff1a; Telnet协议是TCP/IP协议中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。…

iostat -x命令诊断

-x 参数iostat还有一个比较常用的选项-x&#xff0c;该选项将用于显示和io相关的扩展数据。iostat -d -x -k 1 10Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 1.56 28.31 7.80 31.49 42…

prometheus命令_Prometheus入门教程(一):Prometheus 快速入门

点击蓝色“陈树义”关注我哟Prometheus 是任何一个高级工程师必须要掌握的技能。那么如何从零部署一套 Prometheus 监控系统呢&#xff1f;本篇文章将从 Prometheus 的原理讲起&#xff0c;手把手带你用一个最简单的例子部署一套 Prometheus 监控系统。基本原理Prometheus 的基…

WordPress在前台文章页添加后台编辑该文章按钮

在完善主题&#xff08;wpsite 主题&#xff09;的过程中&#xff0c;碰到这样一个问题&#xff0c;如何给 wordpress 文章页面添加一个编辑按钮呢&#xff1f;也就是当用户登录并有权限的时候&#xff0c;可以直接点击该按钮去后台编辑该文章&#xff0c;这对于陌小雨这种有一…

android的progressDialog 的使用。android数据异步加载 对话框提示

在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog ProgressDialog.show(SearchActivity.this, "请稍等...", "获取数据中...", true); 在异步加载完成的时候 progressDialog.dismiss()转载于:https://www.cnb…

Java不定参数

先看两个简单的例子&#xff0c;来感受一下Java的不定长度参数 第一个例子&#xff1a; Java代码 public class VariArgs { public static void main(String[] args) { test(); test("aaa"); test("aaa", "bbb&q…

参数估计_随机微分方程的参数估计(一)

随机微分方程&#xff0c;俗称SDE&#xff0c;相信点进来的同学们肯定对这个概念不感到陌生。SDE呢&#xff0c;是对现实生活中一些随机波动的事物的建模&#xff0c;比如可以用几何布朗运动(GBM)来模拟股价变化&#xff0c;用CIR模型来模拟利率波动。然而一个很现实的问题就是…

「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)

内容较多&#xff0c;可先收藏&#xff0c;目录如下&#xff1a; 一、什么是主从复制 二、主从复制的作用&#xff08;重点&#xff09; 三、主从复制的原理&#xff08;重中之重&#xff09; 四、三步轻松构建主从 五、必问面试题干货分析&#xff08;最最重要的点&#xff09…

为什么WordPress网站应尽量避免使用过多插件

前几天&#xff0c;我们在给一个客户优化其企业网站时&#xff0c;发现其网站使用了太多的WordPress插件。WP插件可以扩展网站的功能&#xff1b;然而如果使用不当&#xff0c;也会给网站带来一些负面的影响。在这篇文章中&#xff0c;WPChina.org就给大家介绍一下&#xff0c;…