La modalità precisa in Boehm GC sotto Mono non è solo GC_MALLOC_ATOMIC
. È vero solo per gli array di tipi fondamentali.
Per i tipi gestiti, viene utilizzato GC_gcj_malloc
. Il compilatore di Mono genera un descrittore di oggetti per ogni tipo gestito e quindi chiama semplicemente GC_gcj_malloc
con un argomento di dimensione e un puntatore al descrittore del tipo gestito. Boehm GC quindi fa riferimento al descrittore durante la fase di mark per tracciare i puntatori gestiti.
Si finiranno con solo i puntatori di root che si trovano sullo stack come puntatori grezzi (GC_gcj_malloc
restituisce un vuoto * e non c'è modo di dire al GC dove i puntatori sono in pila tramite una specie di descrittore di stack prima di GC collect). Questo è il motivo per cui Mono (precedente a SGen) afferma di eseguire la scansione dello stack in modalità conservativa.
Se si desidera implementare questo in C++, non sarà possibile basarsi semplicemente sul compilatore C++ per generare il descrittore dell'oggetto per voi. Quello che ho immaginato molto tempo fa era scrivere un compilatore intermedio che analizza tutti i tuoi file di intestazione C++ per le definizioni di classe che sono state contrassegnate come classe gestita (es. _ref class MyManagedObject
dove _ref
è semplicemente un #define
a zero) e genera un file di intestazione contenente tali oggetti descrittori. Utilizzerai quindi le funzioni GC_make_descriptor
e GC_malloc_explicitly_typed
per allocare gli oggetti in modalità precisa anziché GC_gcj_malloc
in quanto non avresti il controllo su come il tuo compilatore C++ assegna il suo vtable.
* MODIFICA: Vedere Managed C++ for GCC (open source GPL v3).
fonte
2012-10-19 00:03:44
Credo che la modalità precisa abbia bisogno del supporto del compilatore per indicare esattamente dove sono memorizzati i puntatori. Il typecasting in C e C++ rende questo quasi impossibile. –
Quindi ho sentito. Tuttavia, ho pensato che potesse contenere qualche compilatore/piattaforma specifica per renderlo possibile in modo trasparente. – Frigo