2011-05-11 35 views
2

我有一个嵌入在C++应用程序中的V8引擎。可能在V8 garbge收集堆上创建C++对象?

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

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

回答

0

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

我应该提到代代收集器也可以工作,只要他们不使用编译器提示和天真地对待内存。

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

0

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

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

struct A { 
    v8::Handle<A> a; 
    v8::Handle<A> b; 
}; 

v8::Handle<A> rootObject; 

一个代码,你想到的是GC会扫描rootObject,检查其是否有链接ab和标记ab可行的,但rootObject是V8一个黑盒子,它不知道它拥有对ab的引用。 我认为添加扫描C++对象的能力与从头开始编写GC一样困难。

+0

确实存在C/C++的垃圾收集器。可以肯定的是,确定哪些字段是指针似乎有点困难。 GC似乎很好。 – 2013-03-07 20:27:08

+0

C/C++ GC存在,但它们要么是保守的(即只能猜测一个字段是指针),要么依赖比V8更聪明的指针(比如[this](http://www.codeproject.com/Articles/912)/A-垃圾收集框架换C) – 2013-03-07 21:40:58

0

是的,但并非没有一些工作。 V8 providesPersistentBase::SetWeak可以创建一个弱句柄,该句柄允许您定义可用于在垃圾回收中删除本机对象的回调。 但是,不幸的是V8不保证回调会被调用。因此,您需要跟踪所创建的本机对象,并且如果它们没有在此期间调用回调,则delete自己关闭v8::Isolate::Dispose的隔离。