Long term @nogc / allocators usage

ZombineDev via Digitalmars-d digitalmars-d at puremagic.com
Mon Jul 25 03:55:27 PDT 2016


On Sunday, 24 July 2016 at 17:04:43 UTC, Seb wrote:
> On Sunday, 24 July 2016 at 15:34:55 UTC, Lodovico Giaretta 
> wrote:
>> DISCLAIMER: although I've been occasionally using D for a lot 
>> of time, I only recently started to follow the forums and use 
>> it intensively, so I may miss part of the history / long term 
>> vision.
>>
>> So, the current guidelines to make a function usable in @nogc 
>> are:
>> 1) use ranges as much as possible, instead of arrays;
>> 2) don't specify a precise delegate type, but make it 
>> templated (so you accept both gc and @nogc delegates);
>> 3) use manual management (e.g. malloc/free) for internal 
>> buffers whose lifetime and ownership are easy to track.
>>
>> Now, there are some cases in which you cannot avoid the 
>> managed allocations:
>> 1) throwing exceptions: these should not be abandoned in favor 
>> of other solutions; IMHO, they should be easily usable in 
>> @nogc code; switching to error codes or user-defined callbacks 
>> is not feasible in general;
>> 2) returning arrays: sometimes you just can't avoid this: if 
>> your function must return a string, than it has to allocate it 
>> (unless it's a slice of some input)
>>
>> With the new allocators library, we can customize these 
>> allocations. There are two possible ways to follow, both with 
>> advantages and drawbacks:
>> 1) have all allocating functions take a templated allocator 
>> parameter (defaulting to GCAllocator) and use it to allocate 
>> returned arrays and thrown exceptions; this allows the 
>> compiler to infer @nogc whenever a @nogc allocator is passed, 
>> but becomes bloated because you have to carry around another 
>> parameter to lots of functions
>
> When I had to deal with this problem, I liked this idea too, but
>
> 1) Allocations with GCAllocator (e.g. makeArray) are neither 
> @safe, nothrow nor pure.
> 2) It creates a huge template bloat
>
> For 1) the best solution is WIP here:
>
> https://github.com/dlang/phobos/pull/3891
>
>> 2) have all allocating functions use theAllocator instead of 
>> raw new to perform allocations. This would make the allocator 
>> parameter implicit and the code very easy (just set 
>> theAllocator on startup), but would not allow the compiler to 
>> infer @nogc; IMHO it's not that bad: you can always use the 
>> profiler to check that your code is in fact @nogc, even if not 
>> stated explicitly; but many will not agree with this.
>
> Yep it destroys the point of @nogc, besides different data 
> structures / algorithms profit from different, specialized 
> allocators.
>
>> So my question is: what's the plan? Which road is to be 
>> followed? How will Phobos evolve regarding this?
>
> There are also other options [1], e.g.
> - using `static if`
> - using two separate functions (one with `new`)
> - requiring the API user to allocate the data beforehand
>
> [1] https://github.com/dlang/phobos/pull/4190

I prefer alias template parameters as they provide maximum 
flexibility:
https://github.com/dlang/phobos/pull/4288#issuecomment-227609141



More information about the Digitalmars-d mailing list