std.allocator needs your help

BLM768 blm768 at gmail.com
Mon Sep 23 11:02:55 PDT 2013


On Monday, 23 September 2013 at 17:01:47 UTC, deadalnix wrote:
> What you call safe really isn't. Allocate something on the GC, 
> store a pointer on a custom allocated location, collect, enjoy 
> the memory corruption. All operation are safe according to your 
> proposal. Allocation can only be safe if the GRAND MASTER GC is 
> aware of it.

I don't see why the GC can't be allocator-agnostic. In principle, 
it should be possible to register arbitrary allocators with the 
GC (possibly by storing a pointer to the allocator in each 
GC-managed block of memory). The GC would have a default 
allocator which would be used with the "new" operator, and 
something like the aforementioned create!() syntax could be used 
for custom allocators:

SomeClass c1 = new SomeClass("arg");
//Managed by the GC
SomeClass c2 = gcCreate!SomeClass(someAllocator, "arg");
//Another possible syntax (much prettier!):
SomeClass c3 = someAllocator.new SomeClass("arg");

This could also integrate with DIP46; instead of pushing and 
popping a GC object, one would push and pop the GC's default 
allocator (for the current thread, of course).

There would be a bit of overhead, but that seems to be 
unavoidable in a sufficiently generic design, and I doubt that it 
would cut performance to an unacceptable level, especially 
because really performance-critical code would avoid the GC 
anyway.

> You proposal allocate shared memory. This is common in C/C++ 
> world as memory is shared by default, but shouldn't be in D. It 
> is highly desirable to allocate with different methods for 
> different type qualifier. How does your design adapt to that ?

If the aforementioned thread-local GC reference is implemented, 
it should be possible to provide decent thread-local allocation. 
I'm not sure exactly how to design that, but it seems like 
thread-local GC allocation would require some work at the GC 
level; a global GC won't necessarily play nicely with 
thread-local allocators.

For non-GC thread-local allocations, I'd imagine that you could 
just create a thread-local allocator.




More information about the Digitalmars-d mailing list