8-Mar-00 21:36 you wrote:
Khimenko Victor wrote:
7-Mar-00 18:57 you wrote:
One of the things that steers me away from Borland Pascal is its lack of a runtime garbage collector.
Does GNU Pascal have a runtime garbage collector?
No. To All: perhaps something can be done here ? Boehm's GC will work just fine with GPC in simple cases but if you'll try to use strings or some other complex structures it'll be less great :-/ In C++ it's done with "class's new" but I know of no such mechanism in GPC ... At least low-level allocation functions needed (now many bytes GC should allocate to put this structure there? how really put it there?)...
I haven't used it yet, but I don't see the problem. AFAIUI, Boehm's GC http://reality.sgi.com/boehm/gc.html provides a drop-in replacement for malloc() (and a dummy replacement for free()). Since GPC's memory management uses malloc()/free() by default (it can be overwritten on the Pascal level, but this doesn't seem necessary here), it should work, however simple or complex the structures (malloc() doesn't care, it just gets a number of bytes and allocates that much memory).
This is NOT what you usually want. GC ALWAYS has penatly over "normal" malloc/free way. Yes, there are benefits as well but when you are using third-party library where malloc/free already used then with GC's replacement you'll get slowdown and nothing more. In case of C it's all simple: just use malloc/free and gc_alloc as desired. In case of C++ overloaded new can be used for this purpose. In case of GPC you can have GC-enabled new (with GC's malloc) or non GC-enabled new bot not both :-/ You can not just use gc_alloc(sizeof(record)) since if record has embedded strings or files you need to initialize it first (and if record has virtual part then new can allocate less then gc_alloc(sizeof(record)) -- or is this Pascal's feature not implemented yet?). So the question is: is it possible to use another allocator (and deallocator) in GPC's new ? Something akin to field:=new(malloc,OldNormalNonGcClass); ptr:=new(gc_alloc,TestClass); dispose(free,field);
Something like this was discussed when shred memory allocation problem was discussed but I can not find it :-/