在书中看到一有趣的东西,叫做freeList,无非就是优化Link节点类,是的new Link操作跑的更快 !方法是重载运算符,重新定义new,和delete方法。英文书,原理细节描述不清,我的大致理解是,new操作的时候,要跑到内存中去取一块内存单元,CPU在跑着程序,如果能从较近的地方取内存肯定要比去远的地方要好的多。于是,就采取自行管理链表所需内存的方式,定义一freeList链表,为Link类的静态成员变量,初始值为NULL,表示没有“近内存”。调用new方法的时候,如果freelist不为空,那么就在freelist中取一块内存(近内存),如果为NULL,那么只能调用原new操作符,调用“远内存”。调用delete方法的时候,释放的内存不丢弃,而是把它加载到freelist中,供程序之后重新使用。这样的话,程序的运行就可以在小范围内存区域中存取,那么注定要比系统定义的new delete方法要快得多吧...

具体实现代码如下:

//自行管理的Link类
//即重写new,delete函数
class Link{
private:
//因为所有连接共用一个freelist,所以必须定义为静态的
static Link<Elem>* freeList;//Head
public:
Elem element;//该节点的值
Link *next;

Link(Elem elemval,Link *nextval = NULL){
element = elemval;
next = nextval;
}
Link(Link *nextval = NULL){
next = nextval;
}
void* operator new(size_t); //Overload
void operator delete(void *); //Overload
};
//静态变量的初始化
template<class Elem>
Link<Elem>* Link<Elem>::freeList = NULL;
//重载new运算符
template<class Elem>
void* Link<Elem>::operator new(size_t){
if(freeList==NULL) return ::new Link;

Link<Elem>* temp = freeList;//Reuse
freeList = freeList->next;
return temp; //Return the Link
}
template<class Elem>
void Link<Elem>::operator delete(void *ptr){
((Link<Elem>*)ptr)->next = freeList;
freeList = (Link<Elem>*)ptr;
}

转载于:https://www.cnblogs.com/liushang0419/archive/2011/05/29/2061571.html

Link节点类的改进——通过构建freelist自行管理内存相关推荐

  1. 真c++ 从二叉树到红黑树(1)之二叉树节点类及遍历详解

      此文章为从二叉树到红黑树系列文章的第一节,主要介绍写这系列文章的起因,致谢邓老师,解释二叉树节点类和二叉树的四种遍历写法(包括递归和迭代写法) 文章目录 一.前言与致谢~(点击右边波浪线可以返回目 ...

  2. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )

    文章目录 一.构造 Xml 节点类 1.封装节点名称.节点值.节点属性.子节点 2.将封装的节点数据转为 Xml 字符串 二.Xml 节点类完整代码 一.构造 Xml 节点类 生成 Xml 数据前 , ...

  3. boost::mpi模块实现一个简单的点类,我们可以构建、添加、比较和 连载

    boost::mpi模块实现一个简单的点类,我们可以构建.添加.比较和 连载 实现功能 C++实现代码 实现功能 (boost::mpi模块实现一个简单的点类,我们可以构建.添加.比较和 连载 C++ ...

  4. 【玩转cocos2d-x之六】节点类CCNode

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12703741 节点类CCNode可以说是游戏元素的祖宗了,基本上我们看得到的 ...

  5. java查询类提供的方法_查询一个类的方法和构建器的JAVA程序

    查询一个类的方法和构建器的JAVA程序 JAVA语言的类库中的类不计其数,其中设计的方法更是不胜其多,这是任何一个教科书--无论它是多么详尽--所不能穷尽的.如果我们要使用某个类,要查询它的构建器的用 ...

  6. 动力节点笔记-Maven 自动化的构建工具

    目录 Maven 自动化的构建工具 第一章 Maven简介 1.1 软件开发中的阶段 1.2 Maven能做什么 1.3 没有使用maven怎么管理依赖 1.4 什么是maven 1.5 maven中 ...

  7. 华为云CDN节点扩增力度加大,构建全球智能边缘网络

    华为云CDN节点扩增力度加大,构建全球智能边缘网络 CDN是一个能够让内容传输更快的分布式服务器网络.原始内容缓存在全球边缘节点上,从最近的节点为全球用户提供服务.这与仅在客户源站上存储内容的传统方法 ...

  8. 如何在React Native中构建项目并管理静态资源

    by Khoa Pham 通过Khoa Pham 如何在React Native中构建项目并管理静态资源 (How to structure your project and manage stati ...

  9. ASP.NET Core 2.0和Angular 4:从头开始构建用于车辆管理的Web应用程序

    目录 介绍 背景 使用代码 I)服务器端 a)先决条件 b)设置项目 c)设置数据库 d)使用AutoMapper e)使用Swagger f)运行API II)客户端 a)先决条件 b)设置项目 c ...

最新文章

  1. 蜂鸣器接入_无源蜂鸣器的原理和和mixly结合制作电子琴
  2. php字符传截取,php怎么实现字符串截取?
  3. Java Throwable setStackTrace()方法与示例
  4. win7驱动程序未经签名可以使用吗_手把手教你解决win7系统驱动程序签名强制禁用的设置技巧...
  5. python 字典(dict)
  6. php设计要求,《PHP设计模式介绍》第十章 规范模式
  7. boost基础——any
  8. fzyzojP1635 -- 平均值
  9. 计算机主板型号尺寸,10大华硕主板型号简介,组装电脑的朋友可别错过
  10. 6th WEEK BLOG:CSS中的单位(PS调色板)(doing)
  11. 公路护栏设计技术简析
  12. wps怎么插入目录,快速插入目录的操作步骤
  13. 平房误差函数_最小平方误差准则函数.ppt
  14. 服务器发送 微信通知,方糖,使用微信通知的小接口
  15. 一文带你了解常见的数据指标都有哪些【数据分析】
  16. Java常用的集成开发工具Eclipse和IDEA
  17. bind dlz mysql rpm_BIND+DLZ+MYSQL | 学步园
  18. 机器学习之L1正则化和L2正则化(附源码解析)
  19. 西安的草根互联网要靠外力挽救吗?
  20. 为什么微信头像是方的QQ头像是圆的?

热门文章

  1. flask WTForms
  2. php判断是否为数字_PHP知识点:从'xulei' == 0是否为真谈谈运算符===和==
  3. vSphere 故障排错思路总结
  4. 内容库-管理介质和模板的最佳办法(转)
  5. Rust 学习总结(1)—— 初识 Rust,作为新势力它的前景如何?
  6. Linux学习总结(72)——Linux系统安全加固
  7. Docker学习总结(42)——Docker Compose 入门学习
  8. Java基础学习总结(49)——Excel导入导出工具类
  9. Redis学习总结(3)——Redis整合Spring结合使用缓存实例
  10. c++文件内容与输入内容进行比较_使用位运算对数据或文件内容进行加密