Deterministic Memory Management With Standard Library Progress

Guillaume Piolat via Digitalmars-d digitalmars-d at puremagic.com
Sun Mar 5 06:05:12 PST 2017


On Saturday, 4 March 2017 at 18:09:10 UTC, Anthony wrote:
> I've been having difficulty finding an up-to-date answer to 
> this question, so I figured I'd ask the forum: can 
> deterministic memory management be done in D, without losing 
> any main features?

First let's admit that C++ determinism is a strong point and that 
D fares a bit worse on this.

I'll give you the simplistic rules for deterministic destruction 
now (which is required for C++-style deterministic memory 
management). If you follow these rules your program destruction 
will be deterministic and you might even push into being 
exception-safe if you are so inclined. :)

- Use struct RAII wrappers and destructors to release resources. 
Typically structs with disabled postblit. However very often 
resources are classes objects because they feature virtual 
dispatch.

- In destructors, call .destroy on members that are class objects 
(reverse order of their creation if possible). Also on heap 
allocated struct but those are rare. The idea is that when the GC 
kicks in, unreachable objects on the heap should already have 
already been destroyed.

- Don't let the GC release resources, with the "GC-proof resource 
class idiom". I remember Andrei pushing for the GC not to call 
destructors, to no avail. So the GC is calling destructors and 
you should use it as a _warning that something is wrong_ and 
determinisim wasn't respected, not as a safety measure and a way 
to actually release resources (because it's wrong thread, wrong 
timing, unreliable).

- Like in C++, if your ownership is in the case where it's 
shared, you can introduce artificial owners (eg: arena pool owns 
arena pool items).

- The resources that are only memory need no owner and can be 
managed by the GC. (eg: strings, a ubyte[] array...)

When you have deterministic destruction, it's simple to offload 
work from GC to manual memory management. You don't loose ANY 
main feature.

The GC is an efficient way to call free(), and a global owner not 
a way to release resources.

The problem of GC efficiency itself is separate.




More information about the Digitalmars-d mailing list