C++内存管理变革(2):最袖珍的垃圾回收器
理有很强的区域性,在不同的区域(局部过程)中对allocator的需求却又不尽相同。
我们前文也提到了一个例子:一个文档打开,编辑,直到文档被最终关闭,这个完成算不算局部过程呢?在AutoFreeAlloc解决的问题域来看,显然我们无法认为它是一个局部过程。但是,从其他allocator角度来讲,是否就有可能把它作为一个局部过程了呢? 正是考虑到AutoFreeAlloc的缺陷,我们需要一个功能更强的垃圾回收器。这就是我们下一次需要讨论的组件了。 最后,仍然需要明确的一点时。我们很难也不需要实现一个象Java、C#那样的垃圾回收器。提供一个具备特定的内存管理能力的allocator才是正道。 [1] 请参考boost官方网站http://www.boost.org/。 [2] mempool技术是一个很成熟的内存管理技术,被sgi-stl、boost等C++库实现者采用。 [3] 真正是否要把一个过程定义为局部过程,完全取决于设计者本身。例如,一个文档打开,编辑,直到文档被最终关闭,这个完成算不算局部过程呢?在大部分情况下我们认为它不是一个局部过程,但是下回我们将专门讨论是否有可能,以及应该如何将它作为一个局部过程。 [4] 那些提供了垃圾回收器的语言的使用者,显然也有应用了垃圾回收器的烦恼。例如C#在调用非管制代码(如调用Win32 api)时,这些问题变得突出,一个疏忽就留下潜在隐患。这与C/C++程序员遗憾语言没有垃圾回收器的感觉类似。 [5] 当前的_MemBlock的自由内存很可能还是有的,但是不足cb字节。此时我们说这里有内存碎片(memory piece):这些碎片尽管没有人使用,但是我们把它弃而不用。 附加说明: 本文所描述的AutoFreeAlloc组件,完整代码可在WINX库(http://sourceforge.net/projects/winx)中找到。你也可以通过以下链接在线浏览: AutoFreeAlloc完整源代码:http://winx.cvs.sourceforge.net/winx/stdext/include/stdext/memory/AutoFreeAlloc.h?view=markup 另外, 这篇文章写的时间较早,其规格虽然与现在的AutoFreeAlloc一样,但成员函数名改了: Alloc -> allocate Clear -> clear 之所以这样,是因为AutoFreeAlloc被纳入stdext库(这个库可独立于winx界面库,是winx界面库的基础)。stdext库的命名风格尽量与STL的命名习惯一致。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |