Eliminate class allocators and deallocators?
Michel Fortin
michel.fortin at michelf.com
Wed Oct 7 15:19:34 PDT 2009
On 2009-10-07 17:53:21 -0400, Craig Black <cblack at ara.com> said:
>> Yes, recycling is best and I'm considering it. I'm only worried about
>> the extra cost.
>>
>> Andrei
>
> No this is a bad idea. Removing the possibility to delete data will
> cause serious problems with heap fragmentation in some programs.
Hum, perhaps we need to review more thoroughly how memory allocation
works. As Andrei said himself, we now have all the necessary parts in
the language to reimplement 'new' as a library function.
So let's say we ditch 'new' and 'delete' as keywords. Let's first
replace the keyword 'new' with a static function of the same name in a
class or a struct. It could be implemented this way:
static T new(A...)(A a) {
T t = GC.alloc!T(); // GC.alloc sets the T.init bits.
t.__ctor(a);
return t;
}
Usage:
Foo foo = Foo.new();
That's a static function template that needs to be reimplemented for
every subclass (Andrei already proposed such kind of mixins) and that
returns a garbage-collected object reference. Now, if you want manual
allocation:
static T new(A...)(A a) {
T t = GC.allocNoCollect!T(); // GC won't collect this bit.
t.__ctor(a);
return t;
}
void dispose() {
this.__dtor();
GC.free(this);
}
Usage:
Foo foo = Foo.new();
...
foo.dispose();
But then you could do much better: 'new' could return a different type:
a smart reference-counted pointer struct for instance. The
possibilities are endless.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list