Präziser Modus in Boehm Garbage Collector

8

Ich habe auf der Webseite von Mono gelesen, dass sie den Boehm GC im präzisen Modus benutzen. Ich benutze auch den Boehm GC mit C ++, aber ich habe nichts in seiner Dokumentation oder Kopfzeilen gefunden, die einen präzisen Modus anzeigen würden, geschweige denn, wie man ihn einschaltet.

Gibt es irgendeine Information, ob es tatsächlich einen genauen Modus hat und wie man es anschaltet, oder es war nur eine Art Modifikation von Mono-Entwicklern?

    
Frigo 21.07.2011, 10:25
quelle

3 Antworten

4

Die Datei doc / gcinterface.html vom Garbage Collector ( hier archivieren ) sagt:

  

void * GC_MALLOC_ATOMIC (size_t nbytes)       Ordnet nbyte Speicherplatz zu. Benötigt (amortisierte) Zeit   proportional zu nbytes. Das resultierende Objekt wird automatisch erstellt   freigegeben, wenn nicht referenziert. Der Kunde verspricht, dass das Ergebnis   Das Objekt enthält niemals Zeiger. Der Speicher ist nicht gelöscht.   Dies ist der bevorzugte Weg, um Strings, Fließkomma-Arrays,   Bitmaps, etc. Genauere Informationen über Zeigerstandorte können sein   kommuniziert mit dem Kollektor über die Schnittstelle in gc_typed.h in der   Verteilung.

Es sieht so aus, als ob es eine "präzise" Schnittstelle gibt, die verwendet werden kann.

    
gfour 25.07.2011, 19:32
quelle
3

Präziser Modus in Boehm GC unter Mono ist nicht nur GC_MALLOC_ATOMIC . Dies gilt nur für Arrays von fundamentalen Typen.

Für verwaltete Typen wird GC_gcj_malloc verwendet. Der Compiler von Mono generiert einen Objektdeskriptor für jeden verwalteten Typ und ruft dann einfach GC_gcj_malloc mit einem Argument der Größe und einem Zeiger auf den Deskriptor des verwalteten Typs auf. Boehm GC verweist dann auf den Deskriptor während der Markierungsphase, um die verwalteten Zeiger zu verfolgen.

Sie werden am Ende nur die Wurzelzeiger haben, die als rohe Zeiger auf dem Stapel sitzen ( GC_gcj_malloc gibt eine void * zurück und es gibt keine Möglichkeit, dem GC zu sagen, wo sich die Zeiger auf dem Stack befinden GC sammeln). Dies ist der Grund, warum Mono (vor SGen) sagt, dass sie den Stapel im konservativen Modus scannen.

Wenn Sie dies unter C ++ implementieren möchten, können Sie sich nicht einfach auf den C ++ - Compiler verlassen, um den Objektdeskriptor für Sie zu generieren. Vor langer Zeit dachte ich daran, einen Intermediate-Compiler zu schreiben, der alle C ++ - Header-Dateien nach Klassendefinitionen analysiert, die als verwaltete Klasse markiert wurden (zB _ref class MyManagedObject , wobei _ref einfach ein #define zu nichts ist) und generieren eine Header-Datei, die diese Objektdeskriptoren enthält. Sie würden dann die Funktionen GC_make_descriptor und GC_malloc_explicitly_typed verwenden, um Ihre Objekte im präzisen Modus anstatt GC_gcj_malloc zuzuordnen, da Sie nicht kontrollieren könnten, wie Ihr C ++ - Compiler seine vtable zuweist.

* EDIT: Siehe Verwaltetes C ++ für GCC (Open Source GPL v3) .

    
Zach Saw 19.10.2012 00:03
quelle
0

Ich glaube, dass der genaue Modus Unterstützung vom Compiler benötigt, um genau anzugeben, wo Zeiger gespeichert sind. Typecasting in C und C ++ macht dies nahezu unmöglich.

Eine verwaltete Sprache mit eingebauter Reflektion würde das viel einfacher machen.

    
Bo Persson 25.07.2011 19:33
quelle