On Sunday, 22 September 2013 at 23:49:56 UTC, Andrei Alexandrescu wrote:
1. Typed allocator, i.e. every request for allocation comes with the exact type requested;

2. Untyped allocator - traffics exclusively in ubyte[].

This is a good design.

Perhaps this is a later concern, but we should make sure that node-based containers (e.g. linked list, trees) have a way to access the allocation size needed for the node. STL did not do this.


* alignment is a compile-time constant yielding the alignment of allocated data. Many allocators offer the maximum alignment of the platform (for which I used real.alignof above). This constant is required for all allocators.

What if, for example, I wanted to allocate a 4096 byte aligned block from the GC allocator? Do I have to create a new allocator backed by the GC allocator?

What if the alignment is not known at compile time (e.g. hard disk page size or CPU cache line size)?

Might be better to pass the desired alignment in the allocate method.


* available is a property that returns how many total (not necessarily contiguous) bytes are available for allocation. The NullAllocator knows statically it has 0 bytes available so it implements it as an enum. Generally allocators will implement it as a @property. This property is optional.

It would be useful to know the maximum available contiguous block size too, so that you can find out if an allocation will succeed without calling allocate. It's also useful for diagnosing fragmentation issues e.g. "allocation failed, free memory = X, max contiguous = Y". If X is high and Y is low then you are highly fragmented.

Of course, this should be optional.


* allocate(s) returns a ubyte[] with length at least s, or null. (It does not throw on out-of-memory because that would hurt composability; it turns out many elemental allocators do naturally run out of memory.) This method is required for all allocators. In most allocators this method should be @safe.

What are the semantics of allocate(0)? malloc(0) is implementation defined.

Reply via email to