浅议C++的垃圾回收方法

许多 C 或者 C++ 程序员对垃圾回收嗤之以鼻,认为垃圾回收肯定比自己来管理动态内存要低效,而且在回收的时候一定会让程序停顿在那里,而如果自己控制内存管理的话,分配和释放时间都是稳定的,不会导致程序停顿。最后,很多 C/C++ 程序员坚信在C/C++ 中无法实现垃圾回收机制。这些错误的观点都是由于不了解垃圾回收的算法而臆想出来的。

其实垃圾回收机制并不慢,甚至比动态内存分配更高效。因为我们可以只分配不释放,那么分配内存的时候只需要从堆上一直的获得新的内存,移动堆顶的指针就够了;而释放的过程被省略了,自然也加快了速度。现代的垃圾回收算法已经发展了很多,增量收集算法已经可以让垃圾回收过程分段进行,避免打断程序的运行了。而传统的动态内存管理的算法同样有在适当的时间收集内存碎片的工作要做,并不比垃圾回收更有优势。

而垃圾回收的算法的基础通常基于扫描并标记当前可能被使用的所有内存块,从已经被分配的所有内存中把未标记的内存回收来做的。C/C++ 中无法实现垃圾回收的观点通常基于无法正确扫描出所有可能还会被使用的内存块,但是,看似不可能的事情实际上实现起来却并不复杂。首先,通过扫描内存的数据,指向堆上动态分配出来内存的指针是很容易被识别出来的,如果有识别错误,也只能是把一些不是指针的数据当成指针,而不会把指针当成非指针数据。这样,回收垃圾的过程只会漏回收掉而不会错误的把不应该回收的内存清理。其次,如果回溯所有内存块被引用的根,只可能存在于全局变量和当前的栈内,而全局变量(包括函数内的静态变量)都是集中存在于 bss 段或 data段中。

垃圾回收的时候,只需要扫描 bss 段, data 段以及当前被使用着的栈空间,找到可能是动态内存指针的量,把引用到的内存递归扫描就可以得到当前正在使用的所有动态内存了。

如果肯为你的工程实现一个不错的垃圾回收器,提高内存管理的速度,甚至减少总的内存消耗都是可能的。如果有兴趣的话,可以搜索一下网上已有的关于垃圾回收的论文和实现了的库,开拓视野对一个程序员尤为重要。

时间: 2024-11-03 19:33:20

浅议C++的垃圾回收方法的相关文章

Oracle数据库集复制方法浅议_oracle

正在看的ORACLE教程是:Oracle数据库集复制方法浅议.前言 日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步.Oracle数据复制是实现分布式数据环境的一种技术,通过在不同的物理站点拷贝数据来建立分布式数据环境.它与分布式数据库不同,在分布式数据库中,虽然每个数据对象也对所有的站点可用,但是特定的数据对象只存在于一个特定的站点中.而数据复制实现所有的站点都有相同数据对象的可用拷贝. 在一个典型的分布式商业应用中经常需要把个地区的数据备份到总部的数据库中,一

浅议怎样提升网站粘性度 做好内容是关键

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 提到网站的粘性度,可能很多站长还不太明白是怎么一回事,新站长一般不会注意这个问题,他们更加在乎怎样把自己的网站弄得更漂亮一些,功能更全面一些.这样一来,他们往往没有经过系统的分析就会对网站进行整改.有经验的老站长则会考虑到粘性度的问题.今天就浅议一下怎样提升网站的粘性度. 粘性度,简单的理解,可以认为是用户对网站的依赖.举个例子,用户在遇到问

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言:PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection).现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完全兼容.PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变.本文将分别

网络语音视频技术浅议 Visual Studio 2010(转)

      我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮毛,这里只想将自己了解到的一些最基础的知识分享给大家,管中窥豹,略见一斑,更重要的是抛砖引玉,希望更多的朋友们一起来探讨,同时,有讲得不正确的地方也希望大家批评指正.   一.基本流程    无论是即时通讯.视频会议,还是远程医疗.远程教育.网络监控等等系统,都需要获取到远程的语音.视频

浅议团队管理在IT项目实施中的作用

前 言: 团队管理毫无疑问是组织行为学的一部分,之所以写在IT行业,是因为从大二开始接触到了IT行业.也曾和其他人合作进行过一些网站开发项目.我个人感觉目前我们团队面临的就是缺乏一个有效的团队管理法则.在进行一个项目开发的时候,团队成员经常就像无头苍蝇一样到处乱撞.很显然,造成这种现象并不是技术层面上的事情,恰恰就是在项目团队管理上没有经验. 正 文: 如果在IT项目实施中选出最难解决的几个问题,那么管理问题一定名列前茅.在管理问题中,团队管理又是其中的难点.一个项目管理的好坏,很大程度就体现在

浅谈Python的垃圾回收机制_python

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class ClassA(): def __init__(self): print 'object born,id:%s'%str(hex(id(self))) def __del__(self): pr

浅议Web网页Form表单设计技巧

web|技巧|设计|网页 "输入框( Input )应当符合逻辑地划分为小组,这样大脑就可以很好的处理大堆区域间的关系."– <HTML权威指南> Web 应用程序总是利用表单来处理数据录入和配置,但并不是所有的表单都保持一致.输入区域的对齐方式,各自的标签(label),操作方式,以及周围的视觉元素都会或多或少影响用户的行为. 表单布局 考虑到用户完成表单填写的时间应当尽可能的短,并且收集的数据都是用户所熟悉的(比如姓名.地址.付费信息等),垂直对齐的标签和输入框可以说是

浅议PHP程序开发中的模板选择

程序|模板 关于PHP的模板的确是一个说起来容易做起来麻烦的事情.随便一数大概有20种以上的选择,光pear里面就包含了5中不同的模板,实在让人头疼. 千万不要人云亦云的说这个好那个不好,选择模板之前最好先应该搞清楚模板的真正目的是什么? 简单地说,模板的核心目的就是一个 team work.主要的作用方式有两种: 1.分离HTML和PHP使网页设计师和PHP程序员合作更加愉快. 2.分离显示逻辑和事物逻辑,使得核心事务逻辑的变更和应用程序的扩展更加容易和灵活,也就是说使得程序员之间合作更加愉快

浅议网页制作中的表单设计

设计|网页 "输入框( Input )应当符合逻辑地划分为小组,这样大脑就可以很好的处理大堆区域间的关系."– <HTML权威指南> Web 应用程序总是利用表单来处理数据录入和配置,但并不是所有的表单都保持一致.输入区域的对齐方式,各自的标签(label),操作方式,以及周围的视觉元素都会或多或少影响用户的行为. 表单布局 考虑到用户完成表单填写的时间应当尽可能的短,并且收集的数据都是用户所熟悉的(比如姓名.地址.付费信息等),垂直对齐的标签和输入框可以说是最佳的.每对标