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

Reply via email to