Точный режим в Boehm GC под Mono - это не просто GC_MALLOC_ATOMIC
. Это верно только для массивов фундаментальных типов.
Для управляемых типов используется GC_gcj_malloc
. Компилятор Mono генерирует дескриптор объекта для каждого управляемого типа, а затем просто вызывает GC_gcj_malloc
с аргументом размера и указателем на дескриптор управляемого типа. Затем Boehm GC обращается к дескриптору во время фазы пометки для отслеживания управляемых указателей.
Вы получите только корневые указатели, находящиеся в стеке как необработанные указатели (GC_gcj_malloc
возвращает пустоту *, и нет никакого способа сообщить GC, где находятся указатели в стеке, через какой-то дескриптор стека до собирать) По этой причине Mono (до SGen) говорит, что они сканируют стек в консервативном режиме.
Если вы хотите реализовать это в C ++, вы не сможете просто положиться на компилятор C ++ для генерации дескриптора объекта для вас. Давным-давно я предполагал написать промежуточный компилятор, который анализирует все ваши заголовочные файлы C ++ для определений классов, помеченных как управляемый класс (например, _ref class MyManagedObject
, где _ref
- это просто #define
, равный нулю) и генерирует файл заголовка, содержащий эти дескрипторы объекта. Затем вы будете использовать функции GC_make_descriptor
и GC_malloc_explicitly_typed
для выделения ваших объектов в точном режиме, а не GC_gcj_malloc
, поскольку у вас не будет контроля над тем, как ваш компилятор C ++ выделяет свою vtable.
* РЕДАКТИРОВАТЬ: См. Управляемый C ++ для GCC (GPL с открытым исходным кодом v3) .