ETA: std.experimental.allocator -> std.allocator
Seb via Digitalmars-d
digitalmars-d at puremagic.com
Fri Dec 9 20:18:59 PST 2016
Hi all,
tl;dr: I would like to start having GC-free methods and data
structures in Phobos, which depends on std.allocator being stable
(i.e not in experimental).
Q1: So I would like to know what's missing/blocking this? Is it
just time?
(FYI: std.experimental.allocator has been merged in October 2015
and released in November 2015 with 2.069)
One thing that I heard a bit is that there's no defined guideline
on how Allocator APIs should look like. I have seen two good
patterns so far that, but they both have their pros/cons. As I
think this is very important when std.allocator will be used in
Phobos I summarized them below to help everyone to get into the
discussion.
Q2: What is your favorite Allocator API pattern and how should
Phobos APIs facilitate opt-in GC-free algorithms/data structures?
Q3: Are there any plans on providing language support for custom
allocators? E.g.
new int[10] -> theAllocator.makeArray
new FancyClass(foo) -> theAllocator.make!FancyClass(foo)
1) Allocator with GCAllocator as default argument
-------------------------------------------------
I think that's how most people use the Allocator. A prominent
example is the EMSI's container library [1].
The basic idea is that by default all allocations are handled
conveniently by the GCAllocator.
import std.experimental.allocator.gc_allocator: GCAllocator;
void myFun(Allocator = shared GCAllocator)(int foo, ref Allocator
alloc = Allocator.instance)
{
import std.experimental.allocator : makeArray, dispose;
auto b = alloc.makeArray!int(10); // instead of new int[10]
alloc.dispose(b);
}
unittest
{
myFun(2);
import std.experimental.allocator.mallocator: Mallocator;
myFun(2, Mallocator.instance);
}
Please note that although since 2.072 for make/makeArray
attributes are automatically propagated, due to the global
sharedness of the GCAllocator such templated code can't be @safe
(see e.g. [2] for a discussion).
2) makeX pattern
----------------
The idea here is to provide a special makeX method that allows
the use of custom allocator.
This pattern is intended for cases in which allocated data is
returned to the user.
A simplified example from Phobos:
auto slice(T, size_t N)(size_t[N] lengths...);
SliceAllocationResult!(N, T) makeSlice(T, Allocator, size_t
N)(auto ref Allocator alloc, size_t[N] lengths...);
And a short usage example:
slice!int(2, 3);
Mallocator.instance.makeSlice!int(2, 3);
Another good example is mir.combinatorics [2].
The idea here is that it's the users job to deal with the
allocated data, he has to call dispose himself. Thus a
convenience dispose overload may be provided.
[1] https://github.com/economicmodeling/containers
[2] https://github.com/dlang/phobos/pull/4288
[3]
http://dlang.org/phobos/std_experimental_ndslice_slice.html#.ndarray
[4] http://docs.mir.dlang.io/latest/mir_combinatorics.html
More information about the Digitalmars-d
mailing list