#include #include #define HEAP_SIZE 65536 // Arbitrary for now, 2^16 using namespace std; /* A simple mark and sweep algorithm */ // Shouldn't be exposed. For now, it is struct ObjectHeader { size_t size = sizeof(this); bool marked = false; }; struct Object : ObjectHeader { char name; // should be something like id, but for testing sake its char Object* child; // Object(char name_) {} Object(char name_, Object* child_) { name = name_; child = child_; } }; // Representing the heap as a simple struct for now struct Heap { Object heap_space[HEAP_SIZE]; }; // For now it assumes that it is given root objects from the start, no root finding included class MarkSweep { public: void mark(Object* obj) { if (!markedBit(obj)) { markBit(obj); Object* ref = obj->child; if (ref != nullptr) { mark(ref); } } } void sweep(vector worklist) { for (Object* obj: worklist) { if (!markedBit(obj) && obj != nullptr) { delete obj; } } } private: bool markedBit(Object* obj) { return obj->marked; } void markBit(Object* obj) { obj->marked = true; } }; int main() { Object* b = new Object('B', nullptr); // b->name = 'B'; // b->child = nullptr; Object* c = new Object('C', b); // c->name = 'C'; // c->child = b; // c -> d Object* d = new Object('D', nullptr); // d->name = 'D'; // d->child = nullptr; //Heap* heap = new Heap{*c, *b, *d}; vector worklist = {c, b, d}; MarkSweep* gc = new MarkSweep(); gc->mark(c); cout << "Expected 1, got: " << b->marked << '\n'; cout << "Expected 1, got: " << c->marked << '\n'; cout << "Expected 0, got: " << d->marked << '\n'; gc->sweep(worklist); cout << b->name << '\n'; cout << c->name << '\n'; cout << d->name << '\n'; // The object at d is now deleted (freed) return 0; }