[转] C++ 0x 里的垃圾收集器

  • gc_required: 所有资源都要通过GC收集。由gc_required控制的区域内所有指针都是经过标注的gc指针。
  • gc_forbidden: 不允许GC。必须人肉回收内存。由gc_forbidden控制的代码区域里只有原始指针。
  • gc_safe:缺省情况。忽略人肉管理的内存,但处理没有被手工回收的部分。
  • gc_strict: GC处理的代码段里整型变量不包含指针(比如不能在DWORD里放指针)。
  • gc_relax: GC处理的代码段里整型变量可以包含指针。这种情况下GC往往需要扫描大量内存来确保安全回收内存。
  • gc_cast: 把一种类型的GC转换成另外一种类型。
  • 下面是个例子:
     
            class A {
                A *next;
                B b; // 这里不能用gc_strict, 因为我们不知道B里的数据信息。
                gc_strict int data[10000]; // 我们肯定data数组里没有指针
            }
     
        同时C++标准库里还提供两个函数:bool std::is_garbage_collected(),和class std::gc_lock()。一个用来检查某块内存是否被GC回收,另外一块用来设定所谓的GC临界区。临界区内的内存不能被回收,这样可以防止GC不 合时宜地启动。
     
        呵呵,够复杂吧?引入这么多操作的原因之一是要和老的C++系统互动。比如说下面一些情况:
    • 两个DLL,一个用了全局GC,另外一个没有怎么办?如果每个DLL都链接到自己的C类库怎么办?
    • 如果一个共享库希望在内部使用GC,但不影响堆的其它部分怎么办?
    • 如果我们在C++程序内调用libjvm怎么办?libjvm装载后,C++程序可以读取到载入的JVM里的堆,未必我们需要对已经有Java GC控制的内存再做垃圾处理?
        针对不同的情况,我们得祭出不同的GC。嘿嘿,C++程序员们,准备好你们的钱包哈。如果2009年后C++ 0x开始流行,要买的书就多了。比如Effective C++ GC, Master C++ GC, C++ GC with Legacy Applications,  Modern C++ Design with GC, Expert C++ with GC, Expert C++ without GC。这个世道,不容易啊。
      
        那finalization嗫?没有了finalization的GC还叫GC么?C++的大仙们当然不会漏掉这么重要的环节。只不过因为 finalization本身就很复杂了(比如说回收内存时应该怎样调用回收对象的析构函数?如果回收时立刻调用,会造成线程不安全),所以有另外的提案讨论乐。

    相关文章:

    • 2021-10-23
    猜你喜欢
    • 2021-11-26
    • 2021-08-04
    • 2021-05-19
    • 2021-08-03
    • 2021-07-22
    • 2022-01-06
    • 2021-12-11
    相关资源
    相似解决方案