我将V8引擎嵌入到C ++应用程序中。
我希望利用V8中内置的垃圾收集器(特别是压缩功能),但希望存储C ++对象。
我不介意需要手动调用收集器来处理对象,只要可以回收内存。
答案 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
,检查它是否有a
和b
的链接,并标记a
和b
可行,但是{{ 1}}是V8的黑盒子,它不知道它拥有对rootObject
和a
的引用。
我认为添加扫描C ++对象的能力与从头编写GC一样困难。
答案 3 :(得分:0)
是的,但不是没有一些工作。 V8 provides PersistentBase::SetWeak
创建一个弱句柄,它允许您定义一个可用于删除垃圾收集上的本机对象的回调。 然而,遗憾的是V8并不保证会调用回调。因此,您需要跟踪创建的本机对象,如果他们在此期间未调用回调,则在{/ em>关闭隔离专区delete
后自己 {1}}。