Unmanaged - a D framework on github
Paulo Pinto
pjmlp at progtools.org
Wed Mar 20 02:52:14 PDT 2013
On Wednesday, 20 March 2013 at 07:57:13 UTC, Benjamin Thaut wrote:
> Am 17.03.2013 16:20, schrieb Jakob Ovrum:
>> On Saturday, 16 March 2013 at 14:40:58 UTC, D-ratiseur wrote:
>>> new is overriden in TUObject because the purpose of the
>>> library is to
>>> bypass the garbage collector and to bypass the GC you have to
>>> override new and delete.(at least according to the manual:
>>> articles,mem managment).
>>
>> The documentation on this is old and misleading.
>>
>> Overloading of new and delete is deprecated (the delete
>> operator in its
>> entirety is deprecated).
>>
>> Having them overloadable was not a very good idea. The current
>> approach
>> is to have "new" always mean GC memory, which is why there is
>> no need
>> for delete. This way, code that uses 'new' won't break
>> horribly or leak
>> depending on the type involved, important for generic code.
>> Code that
>> doesn't use the GC has to be designed for it; you can't just
>> remove the
>> GC under everyone's noses and expect things to work.
>>
>> For different kinds of memory, you should simply use a
>> different
>> allocator. For example, here's a rough approximation of a pair
>> of
>> functions using malloc/free for class allocation:
>>
>> T alloc(T)() if(is(T == class))
>> {
>> enum size = __traits(classInstanceSize, T);
>> auto p = enforceEx!OutOfMemoryError(malloc(size));
>> return emplace!T(p[0 .. size]);
>> }
>>
>> void dealloc(T)(ref T obj) if(is(T == class))
>> {
>> free(cast(void*)obj);
>> obj = null;
>> }
>>
>> It can easily be overloaded to support all types.
>>
>> In the future, Phobos will have a custom memory allocator
>> library, which
>> modules like std.container will use, though to which extent is
>> not clear
>> (for example, will it also use the custom allocator for
>> exception
>> objects?). Nevertheless it will probably be a good base for
>> other
>> libraries to easily support non-GC allocators.
>
> You still can't replace evertything with custom alloc templates
> and have nice syntax. There are at least two cases where it
> does not work nicely:
>
> 1) Arrays (no new T [size] syntax)
> 2) Inner classes (a template can't automatically capture the
> outer class)
>
> So I think overloading new and delete actually has its place.
> But the way it is currently implemented in D is useless in my
> eyes.
>
> Kind Regards
> Benjamin Thaut
The solution could be like in Turbo Pascal/Delphi, provide an API
to set the memory manager for the runtime.
--
Paulo
More information about the Digitalmars-d-announce
mailing list