2011-07-21 16 views
8

Ho letto sulla pagina web di Mono che stanno usando il GC Boehm in modalità precisa. Anch'io uso il GC Boehm con C++, tuttavia non ho trovato nulla nella sua documentazione o nelle intestazioni che indicherebbe una modalità precisa, tanto meno come accenderlo.Precise mode in Boehm Garbage Collector

Qualunque informazione abbia effettivamente una modalità precisa per impostazione predefinita e come attivarla, oppure è stata solo una sorta di modifica da parte degli sviluppatori Mono?

+1

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. –

+0

Quindi ho sentito. Tuttavia, ho pensato che potesse contenere qualche compilatore/piattaforma specifica per renderlo possibile in modo trasparente. – Frigo

risposta

4

Il file doc/gcinterface.html dal garbage collector (archive here) afferma:

void * GC_MALLOC_ATOMIC (nbytes size_t) Assegna nbytes di stoccaggio. Richiede tempo (ammortizzato) proporzionale a nbyte. L'oggetto risultante sarà automaticamente deallocato quando non referenziato. Il cliente promette che l'oggetto risultante non conterrà mai alcun puntatore. La memoria non è cancellata. Questo è il metodo preferito per allocare stringhe, array in virgola mobile, bitmap , ecc. Informazioni più precise sulle posizioni dei puntatori possono essere comunicate al collector utilizzando l'interfaccia in gc_typed.h nella distribuzione .

Sembra che ci sia un'interfaccia "precisa" che può essere utilizzata.

+0

Credo che sia inverosimile chiamare un costrutto così semplice "preciso". Non risolve il caso in cui puntatori e altre cose sono mescolati. – Frigo

+0

Ok, ho intenzione di accettare questa come risposta. Non sembra esserci una modalità precisa soddisfacente in Boehm, ma GC_MALLOC_ATOMIC o il suo equivalente in C++, operatore new [] (size, PointerFreeGC) alleggeriscono un po 'il problema. Ora utilizzo quest'ultimo per Array , Array , ecc. – Frigo

+0

@Frigo C'è una modalità precisa (tanto quanto Mono è precisa) in Boehm che è possibile utilizzare in C++. Vedi la mia risposta. –

0

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.

Un linguaggio gestito, con la riflessione integrata, renderebbe tutto molto più semplice.

3

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).