我有一个嵌入在C++应用程序中的V8引擎。可能在V8 garbge收集堆上创建C++对象?
我希望利用V8中的内置垃圾回收器(特别是压缩功能),但希望存储C++对象。
我不介意需要手动调用收集器来处理对象,只要可以回收内存即可。
我有一个嵌入在C++应用程序中的V8引擎。可能在V8 garbge收集堆上创建C++对象?
我希望利用V8中的内置垃圾回收器(特别是压缩功能),但希望存储C++对象。
我不介意需要手动调用收集器来处理对象,只要可以回收内存即可。
有趣的想法。我没有使用V8,但我已经编写了C++垃圾收集器。我认为答案实际上取决于V8用于垃圾收集的算法。一个标记和扫描收集器,将内存视为完全平坦的,将适用于任何程序,但速度非常慢。大多数收集器都会进行更多语言特定的优化,并使用实际的对象大小和编译器提示来加快速度,但这不适用于C++。
我应该提到代代收集器也可以工作,只要他们不使用编译器提示和天真地对待内存。
我写的GC使用了我自己的智能指针版本,它对我的特定工作量非常有效。
它在这里解释:http://code.google.com/apis/v8/embed.html#handles
欲了解更多信息搜索V8弱手柄。
我猜测答案是否定的,因为V8不知道C++对象的内部结构。
您需要GC才能够扫描C++对象。如果你有一个像
struct A {
v8::Handle<A> a;
v8::Handle<A> b;
};
v8::Handle<A> rootObject;
一个代码,你想到的是GC会扫描rootObject
,检查其是否有链接a
和b
和标记a
和b
可行的,但rootObject
是V8一个黑盒子,它不知道它拥有对a
和b
的引用。 我认为添加扫描C++对象的能力与从头开始编写GC一样困难。
是的,但并非没有一些工作。 V8 providesPersistentBase::SetWeak
可以创建一个弱句柄,该句柄允许您定义可用于在垃圾回收中删除本机对象的回调。 但是,不幸的是V8不保证回调会被调用。因此,您需要跟踪所创建的本机对象,并且如果它们没有在此期间调用回调,则delete
自己关闭v8::Isolate::Dispose
的隔离。
确实存在C/C++的垃圾收集器。可以肯定的是,确定哪些字段是指针似乎有点困难。 GC似乎很好。 – 2013-03-07 20:27:08
C/C++ GC存在,但它们要么是保守的(即只能猜测一个字段是指针),要么依赖比V8更聪明的指针(比如[this](http://www.codeproject.com/Articles/912)/A-垃圾收集框架换C) – 2013-03-07 21:40:58