C++内存回收——浅议C++ 中的垃圾回收方法
来源:互联网 发布:js代码黑客 编辑:程序博客网 时间:2024/06/05 17:02
浅议C++ 中的垃圾回收方法
作者:出处:BLOG责任编辑: 方舟 [ 2006-04-25 16:58 ]
许多 C 或者 C++ 程序员对垃圾回收嗤之以鼻,认为垃圾回收肯定比自己来管理动态内存要低效
其实垃圾回收机制并不慢,甚至比动态内存分配更高效。因为我们可以只分配不释放,那么分配内存的时候只需要从堆上一直的获得新的内存,移动堆顶的指针就够了;而释放的过程被省略了,自然也加快了速度。现代的垃圾回收算法已经发展了很多,增量收集算法已经可以让垃圾回收过程分段进行,避免打断程序的运行了。而传统的动态内存管理的算法同样有在适当的时间收集内存碎片的工作要做,并不比垃圾回收更有优势。
而垃圾回收的算法的基础通常基于扫描并标记当前可能被使用的所有内存块,从已经被分配的所有内存中把未标记的内存回收来做的。C/C++ 中无法实现垃圾回收的观点通常基于无法正确扫描出所有可能还会被使用的内存块,但是,看似不可能的事情实际上实现起来却并不复杂。首先,通过扫描内存的数据,指向堆上动态分配出来内存的指针是很容易被识别出来的,如果有识别错误,也只能是把一些不是指针的数据当成指针,而不会把指针当成非指针数据。这样,回收垃圾的过程只会漏回收掉而不会错误的把不应该回收的内存清理。其次,如果回溯所有内存块被引用的根,只可能存在于全局变量和当前的栈内,而全局变量(包括函数内的静态变量)都是集中存在于 bss 段或 data段中。
垃圾回收的时候,只需要扫描 bss 段, data 段以及当前被使用着的栈空间,找到可能是动态内存指针的量,把引用到的内存递归扫描就可以得到当前正在使用的所有动态内存了。
如果肯为你的工程实现一个不错的垃圾回收器,提高内存管理的速度,甚至减少总的内存消耗都是可能的。如果有兴趣的话,可以搜索一下网上已有的关于垃圾回收的论文和实现了的库,开拓视野对一个程序员尤为重要。
- C++内存回收——浅议C++ 中的垃圾回收方法
- C#_垃圾回收
- Objective-C内存管理详解——ARC和垃圾回收机制
- 浅议C++ 中的垃圾回收方法
- 浅议C++ 中的垃圾回收方法
- Java内存回收(2)——垃圾回收算法
- Java的内存回收——垃圾回收机制
- Objective-C中的内存回收机制简介
- 垃圾回收器 —— 获取内存
- Java内存管理——垃圾回收
- 极品C/C++内存资源垃圾回收库注释源码
- C指针原理(47)-垃圾回收-内存泄露
- C指针原理(48)-垃圾回收-内存泄露
- C指针原理(49)-垃圾回收-内存泄露
- C/C++中的经典垃圾回收算法概论
- JVM—垃圾回收
- JavaScript中的垃圾回收和内存管理
- Object-C基础(10)——异常处理、反射、动态调用方法与内存回收
- C++内存管理——明晰C++内存分配的五种方法的区别
- 在linux下安装软件
- C++内存管理——控制C++的内存分配
- C++内存管理——浅谈C++中的内存管理
- ASP中时间格式的转换
- C++内存回收——浅议C++ 中的垃圾回收方法
- [笔记]如何使用正则表达式提取字符串中的分隔元素
- Tomcat+JSP经典配置实例
- NAT爆破者:在不同NAT后的主机间建立TCP连接
- C++内存回收——驯服C++中的野指针
- C++内存回收——C++内存对象大会战
- 软件包 javax.servlet 不存在
- 郁达夫诗词选
- linux vsftpd 基本配置