一种基于CPP的垃圾回收器的设计.docx

一种基于CPP的垃圾回收器的设计.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一种基于CPP的垃圾回收器的设计

一种基于C++的垃圾回收器垃圾回收需要的核心技术多线程(并发)垃圾识别确定清理时机内存碎片整理以前C++无法推出一种广泛适用的垃圾回收器,因为标准C++无法实现并发.C++ 11提供了多线程,为垃圾回收器的实现提供了最根本的技术支持.因为多线程已经实现,本文就不提及了.垃圾识别是本文重点阐述的内容确定清理时机与碎片整理设计到相当复杂的算法设计与统计分析,本文并不涉及本文只叙述垃圾识别C++存储区划分为堆栈静态区常量区自由存储区代码区CPU寄存器??1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)静态区常量区代码区完全是编译器的事自由存储器过于底层,C++中能不用就不用实际上内存管理就是堆与栈的管理(现代编译器优先使用CPU寄存器,而不使用栈,但是这种优化机制与只使用栈的表象应当相同(否则就是编译器写错了),本文就不提CPU寄存器啦….)我们考量一段代码int fun(int a,int b){int * c= new int(3);return a+b+*c;}上述代码在堆与栈上的分布从逻辑上可以如上图理解(编译器会优化……,所以仅仅是逻辑上),当函数返回时栈上的数据系统会自动回收,而我没有写delete因而在堆上的数据*c就泄露了这就是内存泄露,当然也有时候对于同一个数据用了多个delete,也是一种常见的问题解决之道就是程序员只负责new,由系统负责delete这就是垃圾回收器的最基本智能,然而,时至今日垃圾回收器还包含了内存碎片整理的职责…………..通过以上分析我们得到,如果堆的地址在栈中没有对应的元素,那么这块堆就是垃圾那么一种很简单的想法就是先扫描堆,建立堆地址集合A,取A中的每一个元素(地址)在栈区中寻找,如果找到就说明此元素不是垃圾,如果没找到就说明它是垃圾,然后将此元素(地址)放入集合B,最终删除集合B中的元素即可上述算法看似可行,实际上并不可行,因为无法获知内存中哪一个堆是分给此程序调度的难以获取栈的操纵权(操作系统可能不支持)最重要的是C++的栈区不仅仅存储的是指针,还有数据,这使得扫描结果根本不可靠解决之道建立代理栈,将指针放入代理栈,并使代理栈与栈区表现一致即栈区中指针被删除,代理栈中指针也被删除建立堆集合,此集合中存放栈中指针所对应堆元素的地址,堆集合只反映堆,不与栈同时变化例如上一个例子,栈区元素int * c消失,对应代理栈void *消失,而堆区以及堆集合仍然存在对比代理栈与堆集合,很轻松就找到了垃圾以下是代码,在VS 2013下编译通过#ifndef __dpointer__DPOINTER__H__h__#define __dpointer__DPOINTER__H__h__#include DPointer.h#include set#include vectornamespace DPointerDatas{typedef void(*VP)(void *);}class DPointerData{private:void * dataPointer;DPointerDatas::VP dataDeleter;DPointerData(){}public:DPointerData(void * DataPointer, void(*DataDeleter)(void *)) :dataPointer(DataPointer), dataDeleter(DataDeleter){}~DPointerData(){}friend bool operator(const DPointerData left, const DPointerData right){return( left.dataPointerright.dataPointer );}friend bool operator==(const DPointerData left, const DPointerData right){return(left.dataPointer==ri

您可能关注的文档

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档