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

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

ID:50290847

大小:54.82 KB

页数:8页

时间:2020-03-07

一种基于CPP的垃圾回收器的设计.docx_第1页
一种基于CPP的垃圾回收器的设计.docx_第2页
一种基于CPP的垃圾回收器的设计.docx_第3页
一种基于CPP的垃圾回收器的设计.docx_第4页
一种基于CPP的垃圾回收器的设计.docx_第5页
资源描述:

《一种基于CPP的垃圾回收器的设计.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一种基于C++的垃圾回收器垃圾回收需要的核心技术1.多线程(并发)2.垃圾识别3.确定清理时机4.内存碎片整理以前C++无法推出一种广泛适用的垃圾回收器,因为标准C++无法实现并发.C++11提供了多线程,为垃圾回收器的实现提供了最根本的技术支持.因为多线程已经实现,本文就不提及了.垃圾识别是本文重点阐述的内容确定清理时机与碎片整理设计到相当复杂的算法设计与统计分析,本文并不涉及本文只叙述垃圾识别C++存储区划分为堆栈静态区常量区自由存储区代码区CPU寄存器??1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚

2、的变量的存储区。里面的变量通常是局部变量、函数参数等。2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。5.常量

3、存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)静态区常量区代码区完全是编译器的事自由存储器过于底层,C++中能不用就不用实际上内存管理就是堆与栈的管理(现代编译器优先使用CPU寄存器,而不使用栈,但是这种优化机制与只使用栈的表象应当相同(否则就是编译器写错了),本文就不提CPU寄存器啦….)我们考量一段代码intfun(inta,intb){int*c=newint(3);returna+b+*c;}栈return->intInt*cIntaIntb函数fun返回地址

4、堆*c上述代码在堆与栈上的分布从逻辑上可以如上图理解(编译器会优化……,所以仅仅是逻辑上),当函数返回时栈上的数据系统会自动回收,而我没有写delete因而在堆上的数据*c就泄露了这就是内存泄露,当然也有时候对于同一个数据用了多个delete,也是一种常见的问题解决之道就是程序员只负责new,由系统负责delete这就是垃圾回收器的最基本智能,然而,时至今日垃圾回收器还包含了内存碎片整理的职责…………..通过以上分析我们得到,如果堆的地址在栈中没有对应的元素,那么这块堆就是垃圾那么一种很简单的想法就是先扫描堆,建立堆地址集合

5、A,取A中的每一个元素(地址)在栈区中寻找,如果找到就说明此元素不是垃圾,如果没找到就说明它是垃圾,然后将此元素(地址)放入集合B,最终删除集合B中的元素即可上述算法看似可行,实际上并不可行,因为1.无法获知内存中哪一个堆是分给此程序调度的2.难以获取栈的操纵权(操作系统可能不支持)3.最重要的是C++的栈区不仅仅存储的是指针,还有数据,这使得扫描结果根本不可靠栈return->intInt*cIntaIntb函数fun返回地址堆*c代理栈     void* 堆集合         void* 解决之道建立代理栈,将指针放

6、入代理栈,并使代理栈与栈区表现一致即栈区中指针被删除,代理栈中指针也被删除建立堆集合,此集合中存放栈中指针所对应堆元素的地址,堆集合只反映堆,不与栈同时变化栈堆*c代理栈      堆集合         void* 例如上一个例子,栈区元素int*c消失,对应代理栈void*消失,而堆区以及堆集合仍然存在对比代理栈与堆集合,很轻松就找到了垃圾以下是代码,在VS2013下编译通过#ifndef__dpointer__DPOINTER__H__h__#define__dpointer__DPOINTER__H__h__#inc

7、lude"DPointer.h"#include#includenamespaceDPointerDatas{typedefvoid(*VP)(void*);}classDPointerData{private:void*dataPointer;DPointerDatas::VPdataDeleter;DPointerData(){}public:DPointerData(void*DataPointer,void(*DataDeleter)(void*)):dataPointer(DataPoin

8、ter),dataDeleter(DataDeleter){}~DPointerData(){}friendbooloperator<(constDPointerData&left,constDPointerData&right){return(left.dataPointer

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。