Boehm垃圾收集器中的精确模式

Fri*_*igo 9 c++ garbage-collection boehm-gc

我在Mono的网页上看到他们在精确模式下使用Boehm GC.我也使用Boehm GC与C++,但是,我在其文档或标题中没有发现任何表明精确模式的内容,更不用说如何打开它.

是否有任何信息默认情况下它实际上是否具有精确模式以及如何打开它,或者它只是Mono开发人员的某种修改?

Zac*_*Saw 5

在Mono下Boehm GC中的精确模式不仅仅是GC_MALLOC_ATOMIC。这仅适用于基本类型的数组。

对于托管类型,GC_gcj_malloc使用。Mono的编译器为每种托管类型生成一个对象描述符,然后简单地GC_gcj_malloc使用size参数和指向托管类型描述符的指针进行调用。Boehm GC然后在标记阶段引用描述符以跟踪托管指针。

您最终只会将根指针作为原始指针放在堆栈上(GC_gcj_malloc返回void *,并且在GC收集之前无法通过某种堆栈描述符来告诉GC指针在堆栈上的位置)。这就是Mono(在SGen之前)表示他们以保守模式扫描堆栈的原因。

如果要在C ++中实现此功能,则将无法仅依靠C ++编译器为您生成对象描述符。我以前设想的很长一段时间是写一个中间编译器,它分析你所有的C ++头类定义已被标记为管理类文件(如_ref class MyManagedObject这里_ref仅仅是一个#define不了了之),并生成一个包含这些对象描述符的头文件。然后,您将使用GC_make_descriptorGC_malloc_explicitly_typed函数以精确模式分配对象,而不是GC_gcj_malloc因为您无法控制C ++编译器分配其vtable的方式。

*编辑:请参阅GCC的托管C ++(开源GPL v3)


gfo*_*our 4

来自垃圾收集器的文件 doc/gcinterface.html (此处存档)指出:

void * GC_MALLOC_ATOMIC(size_t nbytes) 分配 nbytes 的存储空间。需要与 nbytes 成比例的(摊销)时间。当未引用时,生成的对象将自动释放。客户端承诺生成的对象将永远不会包含任何指针。内存没有被清除。这是分配字符串、浮点数组、位图等的首选方式。有关指针位置的更精确信息可以使用发行版中 gc_typed.h 中的接口传递给收集器。

看起来有一个“精确”的接口可以使用。