manual memory management

Era Scarecrow rtcvb32 at yahoo.com
Wed Jan 9 12:31:14 PST 2013


On Monday, 7 January 2013 at 15:01:27 UTC, Gor Gyolchanyan wrote:
> Hello, folks!
>
> I'm on to a project, which requires manual memory management 
> using custom allocators, but I can't seem to get dynamic arrays 
> and associative arrays to work.
>
> The std.conv.emplace only allocates the pointer and the size of 
> the dynamic array and pointer to the associative array, which 
> is half the issue.
>
> I can work around the dynamic array by manually allocating the 
> elements of the array and returning a slice to the result 
> (although I'd be really glad if I could directly use arrays 
> with my custom allocators).


  I got to Page 3 but I really wanted to comment on some of this; 
perhaps a step in the non-GC portion.

  A thought coming to mind is to modify the existing D language to 
include custom allocator/deallocator. The idea of sorta borrowing 
from java will do the job. So 'new' can be a function which's 
only purpose is to allocate memory, renew can be resizing 
(appending?), and release is to handle deallocation.

   struct S {
     //similar to java's 'new' (C++ as well?) function.
     //'this' referencing the struct's current storage/pointer 
location.
     new(this, int size = S.sizeof) {
       assert(size >= S.sizeof);
       this = cast(S) GC.malloc(size);
       //ctor's called after new ends
     }

     //array (multidimentional?) allocation handling.
     //new[] or newArray?. Probably no ctor afterwards
     new(this, int size, int[] multiDimentional ...);

     //handles deallocation (if applicable), with GC it's probably 
empty
     //coinsides with already used releasing of memory.
     void release();

     //handles resizing (in place?), probably arrays,
     //could be realloc() and referring to the current object 
already...?
     //void realloc(int newSize);
     renew(this, int newSize) {
       S old = this.ptr;
       this.ptr = GC.realloc(this.ptr, newSize);
       if (old !is this.ptr)
         {} //reallocated not appended
     }

     //potentially above new could be used for reallocation as 
well... So
     //rewritten instead as:
     new(this, int size = S.sizeof) {
       assert(size >= S.sizeof);
       this = cast(S) GC.realloc(this, size);
       //ctor's called after new ends
     }
   }

  Just a thrown together gist. It's kinda how I remember with 
zlib's setup where you could specify the allocator/deallocator, 
and if you didn't it used the default. I know it's got problems 
as it is, but that doesn't mean it can't be used for 
brainstorming to handle alternate memory management.


More information about the Digitalmars-d mailing list