Deterministic Memory Management With Standard Library Progress

Anthony via Digitalmars-d digitalmars-d at puremagic.com
Mon Mar 6 08:10:51 PST 2017


On Sunday, 5 March 2017 at 13:32:04 UTC, Moritz Maxeiner wrote:
>> I was referring to phobos. I feel intimidated by the idea of 
>> trying to code some of the functions of phobos myself in a 
>> no-gc manner. I'm sure I'd run into things way out of my 
>> knowledge domain.
>
> I get that, though usually Phobos code is fairly readable if 
> you've got a firm grasp of D templates.

Hmm. This is encouraging news to here, given that templates were 
the most recent topic I've learned in D. Maybe I'll just have to 
give GC-reliant areas a read. Although I don't know what those 
areas would be; AFAIK I'd have to look for @nogc tags, which 
sounds tedious.

As for Guillaume Piolat's Advice:
> - 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.

This is also encouraging! Thanks for the concrete advice. But, I 
think due to my inexperience, to don't really understand some of 
your advice. Specifically, the only-memory recourses like strings 
and arrays can be managed by the GC, and arena pools. I can just 
look these things up, but I figured it'd be easy to ask first.


More information about the Digitalmars-d mailing list