Eliminate class allocators and deallocators?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Oct 7 12:16:37 PDT 2009


Sean Kelly wrote:
> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s article
>> dsimcha wrote:
>>> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s article
>>>> It is a bad idea because distinguishing between release of (expensive)
>>>> resources from dangerous memory recycling is the correct way to obtain
>>>> deterministic resource management within the confines of safety.
>>> This is based on two faulty assumptions:
>>>
>>> 1.  Memory is cheap.  (Not if you are working with absurd amounts of data).
>>> 2.  Garbage collection is never a major bottleneck.  (Sometimes it's a worthwhile
>>> tradeoff to add a few manual delete statements to code and sacrifice some safety
>>> for making the GC run less often.)
>> malloc.
> 
> So for placement construction of a class, I guess it would look something like:
> 
> auto x = cast(MyClass) malloc(MyClass.classinfo.init.length);
> x.__ctor( a, b, c ); // construct
> ...
> x.__dtor();
> free( cast(void*) x );
> 
> Is that right?

Yes, I think so, but I haven't checked all the details. For example I'm 
not sure whether __ctor copies .init over the memory before running the 
user-defined constructor, or expects that to have been done already.

My understanding from Walter is that __ctor(x, y, z) are simply the 
functions this(x, y, z) as written by the user, so you'd need to memcpy 
the .init by hand before calling __ctor.

Aw hell I got curious so let me check.

class MyClass {
     int x = 42;
     this() {}
}

void main() {
     auto x = cast(MyClass) malloc(MyClass.classinfo.init.length);
     x.__ctor();
     writeln(x.x);
     writeln(x.toString);
}

That prints 0 and then crashes on my machine. Looks like you need to 
memcpy the .init before calling __ctor.

I'm very glad we're starting to look into this. There are very nice 
opportunities for adding custom allocation support in the stdlib.


Andrei



More information about the Digitalmars-d mailing list