On 26/05/2017 9:15 AM, realhet wrote:
Thanks for the answer!

But hey, the GC knows that is should not search for any pointers in those large blocks. And the buffer is full of 0-s at the start, so there can't be any 'false pointers' in it. And I think the GC will not search in it either.

The only reference to the buffer is 'st' which will die shortly after it has been allocated.

64bit is not a solution because I need to produce a 32bit dll, and I also wanna use 32bit asm objs.
The total 2GB amount of memory is more than enough for the problem.
My program have to produce 300..500 MB of continuous data frequently. This works in MSVC32, but with D's GC it starts to eat memory and fails at the 4th iteration. Actually it never releases the previous blocks even I say so with destroy().

At this point I only can think of:
a) Work with the D allocator but emulate large blocks by virtually stitching small blocks together. (this is unnecessary complexity) b) Allocating memory by Win32 api and not using D goodies anymore (also unnecessary complexity)

But these are ugly workarounds. :S

I also tried to allocate smaller blocks than the previous one, so it would easily fit to the prevouisly released space, and yet it keeps eating memory:

void alloc_dealloc(size_t siz){
     auto st = new ubyte[siz];
}

void main(){
     foreach(i; 0..4) alloc_dealloc(500_000_000 - 50_000_000*i);
}

If you have to use such large amounts frequently, you really have to go with buffers of memory that you control, not the GC. Memory allocation is always expensive, if you can prevent it all the better.

Reply via email to