我正在使用C++0x实现一个紧凑型垃圾收集器,需要涉及移动对象,因此我有一个问题。我在思考如何通过智能指针类型来实现移动对象的机制。我一直在考虑在指针类型本身中使用指向指针的指针,或者收集器维护指向每个对象的指针列表,这样它们可以被修改,在访问指针时删除了双重引用的需求但增加了一些额外的收集和内存开销。请问这里最好的方法是什么?
编辑:我的主要关注点是快速分配和访问。我不关心特别高效的收集或其他维护,因为这不是GC的主要目的。
我正在使用C++0x实现一个紧凑型垃圾收集器,需要涉及移动对象,因此我有一个问题。我在思考如何通过智能指针类型来实现移动对象的机制。我一直在考虑在指针类型本身中使用指向指针的指针,或者收集器维护指向每个对象的指针列表,这样它们可以被修改,在访问指针时删除了双重引用的需求但增加了一些额外的收集和内存开销。请问这里最好的方法是什么?
编辑:我的主要关注点是快速分配和访问。我不关心特别高效的收集或其他维护,因为这不是GC的主要目的。
new(shape, collector) T(args)
。这里的shape
是一个类型的描述符,包括一个偏移量列表,其中包含(GC)指针,并且还包含一个用于最终化对象的例程的地址(默认情况下,它调用析构函数)。memmove
移动。如果对象很大或者是不可移动的,它将由malloc
分配。如果对象很小且可移动,则在arena中分配,前提是arena中有空间。shape
对象来传递。这并不困扰我,因为我正在实现一种可以自动生成形状信息的语言。标记-清除
(有时为了避免堆碎片而使用标记-压缩
)在分配和访问方面是最快的(避免双重引用)。它也非常容易实现。由于您不必担心收集性能影响(标记-清除往往会在非确定性情况下冻结进程),因此应该选择这种方式。使用幼儿园代际将为您提供最佳的分配性能,因为它只是一个指针增量。
您可以通过使用技术(如影子堆栈)来实现指针更新而不使用双重间接引用,但如果您手动编写此C++代码,则这将非常缓慢且容易出错。
new
进行补充,而不是替代它。 - Puppy