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

浅议C++中的垃圾回收方法,第1张

浅议C++中的垃圾回收方法,第2张

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

实际上,垃圾收集机制并不慢,甚至比动态内存分配更高效。因为只能分配不能释放,所以在分配内存的时候,我们只需要一直从堆里获取新的内存,移动堆顶的指针就够了。而且省去了放生的过程,自然加快了速度。现代垃圾收集算法发展了很多,增量收集算法可以使垃圾收集过程分段进行,避免中断程序的运行。而传统的动态内存管理算法也要在合适的时间收集内存碎片,这并不比垃圾收集更有优势。

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

垃圾回收时,只需要扫描bss段、数据段和当前使用的stack 空就可以找到可能是动态内存指针的量,然后递归扫描引用的内存就可以得到当前使用的所有动态内存。

如果你愿意为你的项目实现一个好的垃圾收集器,就有可能提高内存管理的速度,甚至减少总的内存消耗。如果你有兴趣,你可以在网上搜索现有的关于垃圾收集的论文和图书馆。对于一个程序员来说,开阔眼界尤为重要。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 浅议C++中的垃圾回收方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情