一个简单的垃圾回收机制要求与算法

来源:互联网 发布:网络骑士 异世帝王行 编辑:程序博客网 时间:2024/05/17 02:42

垃圾回收机制算法的要求:

1.与内建的与C++手工提供的方法共存  Coexist with the built-in, manual method provided by C++.

 

 

2.不要对现有的代码与习惯造成破坏   Not break any preexisting code. Moreover, it must have no impact whatsoever on existing code.

 

 

3.有透明性,与不使用垃圾回收机制的解决方案一样  Work transparently so that allocations that use garbage collection are operated on in the same way as those that don’t.

 

 

4.在语法上与new表达式一样  Allocate memory using new in the same way that C++’s built-in approach does

5.对所有对象都有效   Work with all data types, including the built-in types such as int and double.

6.易于使用   Be simple to use

In short, the garbage collection system must be able to dynamically allocate memory using a mechanism and syntax that closely resemble that already used by C++ and not affect existing code. At first thought, this might seem to be a daunting task, but it isn’t.

 

 

垃圾回收机制的算法

1引用记数法

为每个C++动态分配的内存都增加一个引用计数器,这个计数器在对内存引用增加的时候加1,在取消对内存引用的时候减1.当然实现与效率是很可观的,但是请注意循环引用的特殊情况:当两个对象互相指向对方的时候.呵呵,永远不会释放了.当然也就Memory Leak.

2标记并清除

开始阶段,所有堆中空间都是标记为未使用状态,然后标记所有被引用无论直接或者间接为使用状态.第二阶段,扫描所有已经分配的内存并释放未标记的空间.这个办法解决了循环引用问题,但是扫描整个堆带来的是效率的低下.

 

 

我们实现垃圾回收机制的算法

引用记数法,当为了解决循环引用的问题,我们在整个程序退出的时候会释放全部动态分配的内存.

我们必须为动态分配对象维护一个引用记数的链表;必须跟踪所有指针运算符,当有某个指针指向动态分配的对象时候,要将该对象的计数器加1;必须回收那些计数器为0的对象内存

所以我们必须构造一个新类型,一个指向动态分配对象的指针类型.当需要垃圾回收机制,我们可以使用这个类型的指针,不需要的时候,我们可以使用普通指针.

 

 

我们什么时候需要它来回收垃圾??

利用多线程的OS环境下我们可以在后台自动执行回收机制,单线程环境下呢?频繁的回收会导致效率的低下,我们应该在内存持续降低的情况下来使用垃圾回收机制.

 

 

关于auto_ptr

Auto_ptrISO C++所谓的严格所有权的一个指针类型,它在我们的垃圾回收机制下毫无用处.

原创粉丝点击