- 4
- 0
- 约4.65千字
- 约 8页
- 2017-09-11 发布于四川
- 举报
一种基于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
您可能关注的文档
- 《模拟人生3》大学生活及格指南.doc
- 《月光曲》教学设计参赛作品.doc
- 《模拟人生3》VE图文攻略(塑料师篇).doc
- 《正确使用标点符号》学生版.doc
- 《毛线小精灵》图文攻略全收集通关图文攻略.docx
- 《消失的爱人》电影完整版.doc
- 《沁园春长沙》说课稿苏教必修一.doc
- 《混沌之戒2》攻略全集(非剧情部分).docx
- 《灰姑娘》电影完整版.doc
- 《爱迪生救妈妈》定稿3.doc
- 2025年版汽车趋势报告 The 2025 EPA Automotive Trends Report.docx
- 2026年边缘计算开源平台EdgeX Foundry入门与二次开发.docx
- 2026年超声内镜放大内镜早癌诊断AI辅助识别系统临床评价.docx
- 2026年报废汽车回收与再制造逆向物流体系.docx
- 2026年产品碳足迹核算方法学:从摇篮到大门与从摇篮到坟墓.docx
- 2026年城乡要素平等交换双向流动政策创新试点申报材料.docx
- 2026年超导半导体接口电路架构与电平转换驱动器设计.docx
- 2026年财政贴息不再以再贷款支持为前提后的风险防范与合规要点.docx
- 2026年不动产信托登记试点政策对遗嘱信托支持.docx
- 2026年城乡有机废弃物协同处理技术方案.docx
最近下载
- 2024年河南省第三届职业技能大赛美容(世赛选拔)项目技术工作文件.pdf
- 2025年江苏苏州中学匡亚明班自主招生数学试卷真题(含答案详解).docx VIP
- 北京大学科研经费博士研究生专项招生计划招生指南.pptx VIP
- 2026年度江苏旅游职业学院单招《数学》考试综合练习完美版附答案详解.docx VIP
- 关爱女性健康 预防乳腺疾病.pptx VIP
- 说勤原文范文.docx VIP
- 2026年江苏旅游职业学院单招语文考试卷.docx VIP
- 外文翻译--基于单片机的智能电风扇控制系统(外文原文+中文翻译).docx VIP
- 用三坐标测量机正确测量同轴度误差.pdf VIP
- 2025年浙江慈溪中学提前自主招生考试数学试卷(含答案详解).docx
原创力文档

文档评论(0)