2013-11-15 10 views
5

Ich arbeite an einem Lernprojekt von mir (in C) und dachte daran, es für zusätzliche Lernpunkte nach C++ zu migrieren. Ein Teil davon beinhaltet ein Garbage-Collection-System für eine bestimmte Familie von Objekten, die ich in C normalerweise mit einem großen malloc/mmap implementieren würde und mit einem einfachen naiven Mark-and-Sweep (ich kann Referenzen und ähnliches identifizieren) bereits).Toy Garbage Collection: Ist der Operator neu/löschen genug?

Mein Problem ist, dass ich erwog, diese Idee zu C++ zu transportieren, aber ich fühle mich nicht sicher genug über mein Verständnis des Speichermanagements.

Bisher dachte ich über die Zuweisung eines großen Speicherpools und das Überladen von Operatoren new und delete auf einer Basisklasse, um die Grab/release-Funktionen meines Speicherpools aufzurufen und dann die Sweepphase des Garbage Collectors zu löschen . Ist das genug? Was sind die versteckten Fallstricke, die ich hier nicht sehe?

Edit: um zu klären, ich bin in der Lage, die Lebensdauer der zugeordneten Objekte bereits herauszufinden, so dass es nicht notwendig ist, die GCI ABI zu verwenden. Die Objekte werden selten durch C++ - Code manipuliert, und der Code, der sie verwendet, ist in der Lage, zu informieren, dass sie verwendet werden, ohne dass der Stapel überprüft werden muss.

+0

Vielleicht möchten Sie Bjarne Stroustrup die Kommentare dazu als Ausgangspunkt lesen: http://www.stroustrup.com/C++11FAQ.html#gc-abi Es hat auch Links zu Hans Boehm Seiten, so denke ich Es ist ein ausgezeichneter Ausgangspunkt. –

Antwort

1

Wenn Sie die Klassen ändern, lassen Sie sie nicht von einer neuen Basisklasse erben, die sich während der Konstruktion bei einem GC registriert und die Registrierung bei der Zerstörung aufhebt. Die Managerklasse wird die Buchhaltung übernehmen. Die Basisklasse kann eine Vorlage sein:

template <class parent> class BASE_GC { 
    BASE_GC() { /* register address and name*/} 
    ~BASE_GC() { /* unregister*/} 
}; 

die übergeordnete Klasse Namen von typeid (* this) .NAME() abgeleitet werden kann. Da der Basisklassenname den übergeordneten Namen enthält.

+0

Dies könnte tatsächlich alles tun, was ich brauche. Wenn ich, anstatt einfach nur die GC-Buchhaltung zu machen, beschließe, einen anderen Zuordner zu verwenden, um mit verschiedenen Zuweisungsstrategien zu spielen, würde es einen Konflikt geben mit bloßem Überschreiben des Bedieners neu und löschen? Wenn ich schließlich den Operator new und delete überschreibe, macht es sogar Sinn, die GC-Buchhaltung auf Konstruktor/Destruktor statt auf die Speicheroperatoren zu beschränken? –