2011-05-11 55 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的隔離。