我有一個嵌入在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