automem v0.0.7 - C++ style smart pointers using std.experimental.allocator

Andrei Alexandrescu via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Sun Apr 9 06:59:14 PDT 2017


On 4/9/17 4:56 AM, Atila Neves wrote:
> Using std.experimental.allocator? Tired of writing `scope(exit) 
> allocator.dispose(foo);` in a language with RAII? Me too:
> 
> 
> 
> http://code.dlang.org/packages/automem
> 
> Example:
> 
> I think the code in the README should be enough to understand what's 
> going on. Alpha stuff here but I think the main things missing are weak 
> pointers and a ref counted array. Given that I've never had to use 
> std::weak_ptr in C++, I'm not in a hurry to implement the former.

Nice work!

> Notable design decisions / features:
> 
> . The smart pointers are responsible for allocating the memory for the 
> container object using the allocator of choice. This is to guarantee 
> that one can't allocate and deallocate using different allocators.

Nice!

> . The allocator has to be specified as part of the type: this means the 
> user can choose how to store it in the smart pointer, which for 
> singletons (e.g. Mallocator) or stateless allocators means they can take 
> up zero space. If a singleton (or the default theAllocator), the 
> allocator doesn't need to be passed in to the constructor, otherwise it 
> does. Specifying, e.g. Mallocator also means the relevant code can be 
> marked @nogc.

After extensively studying how C++ allocator framework works, I got to 
the notion that making the allocator part of the type is an antipattern.

> . RefCounted only increments/decrements the ref count atomically if the 
> contained type is `shared`

Great. Can RefCounted itself be shared? I learned this is important for 
composition, i.e. you want to make a RefCounted a field in another 
object that is itself shared, immutable etc.

> . RefCounted!(shared T) can be sent to other threads.

Awes.

> . UniqueArray behaves nearly like a normal array. You can even append to 
> it, but it won't use GC memory (unless, of course, you chose to use 
> GCAllocator)!

This may be a great candidate for the standard library.


Andrei


More information about the Digitalmars-d-announce mailing list