可以在V8垃圾回收堆上创建C ++对象吗?

时间:2011-05-11 02:54:14

标签: v8

我将V8引擎嵌入到C ++应用程序中。

我希望利用V8中内置的垃圾收集器(特别是压缩功能),但希望存储C ++对象。

我不介意需要手动调用收集器来处理对象,只要可以回收内存。

4 个答案:

答案 0 :(得分:0)

有趣的想法。我没有使用V8,但我编写了C ++垃圾收集器。我认为答案实际上取决于V8用于垃圾收集的算法。将记忆视为完全平坦的标记和扫描收集器将适用于任何程序,但速度非常慢。大多数收集器进行更多特定于语言的优化,并使用实际的对象大小和编译器提示来加快速度,这不适用于C ++。

我应该提到,世代收藏家也可以工作,只要他们不这样做;使用编译器提示并天真地对待记忆。

我编写的GC使用了我自己的智能指针版本,它对我的​​特定工作负载非常有效。

答案 1 :(得分:0)

这里解释:http://code.google.com/apis/v8/embed.html#handles

有关更多信息,请搜索v8弱手柄。

答案 2 :(得分:0)

我的猜测答案是否定的,因为V8不知道C ++对象的内部结构。

您需要GC才能扫描C ++对象。如果您有像

这样的代码
struct A {
    v8::Handle<A> a;
    v8::Handle<A> b;
};

v8::Handle<A> rootObject;

您希望GC会扫描rootObject,检查它是否有ab的链接,并标记ab可行,但是{{ 1}}是V8的黑盒子,它不知道它拥有对rootObjecta的引用。 我认为添加扫描C ++对象的能力与从头编写GC一样困难。

答案 3 :(得分:0)

是的,但不是没有一些工作。 V8 provides PersistentBase::SetWeak创建一个弱句柄,它允许您定义一个可用于删除垃圾收集上的本机对象的回调。 然而,遗憾的是V8并不保证会调用回调。因此,您需要跟踪创建的本机对象,如果他们在此期间未调用回调,则在{/ em>关闭隔离专区delete后自己 {1}}。