How to save RAM in D programs (on zero initialized buffers)
Marco Leise
Marco.Leise at gmx.de
Wed Feb 8 07:36:24 PST 2012
Am 08.02.2012, 14:30 Uhr, schrieb Manfred Nowak <svv1999 at hotmail.com>:
> Marco Leise wrote:
>
>> In D we allocate memory through the GC
> [...]
>> Let's assume, we have a program that allocates some buffers in
>> advance, that it may not use fully.
> [...]
>> there is really no alternative to calloc.
>
> 1)
> calloc implements a strategie for allocating memory. If this strategy
> is usefull for parts of a program, then the GC should be informed
> from the code and be capable to adapt its behavior to the requested
> strategy.
That sounds a bit vague. If I understand you correctly you would implement
this as a hint flag, like
GC.allocHint = AllocationHint.lazyZero;
auto arr = new ubyte[…];
> This seems necessary because there is not only the null pattern to
> initialize allocated memory.
>
> 2)
> According to your OP the request for allocating memory can be
> disjoint partitioned into three:
> a) memory that is guaranteed to be used
> b) memory that is guaranteed not to be used and
> c) memory that might be used.
>
> For the case that a + b exceeds available memory, should the coder
> predeclare a strategy, i.e. should the GC signal out of memory on
> request of the memory or should the GC wait until that sum reaches
> some deadline?
>
> -manfred
Here I can't follow you. The request to allocate memory contains memory
regions that are guaranteed not to be used? Why would I request them then?
Also, what is your definition of available memory? Available RAM, RAM +
swap or available virtual memory going beyond what the operating system
can commit and resulting in random killing of applications
(http://linux-mm.org/OOM_Killer)
I don't see where the GC enters the picture, since all this 'may use
memory, but don't commit on it' is handled solely by the OS. I could only
imagine a function in the GC that always allocates a new chunnk of memory
and does that through calloc - or the hammer method - all allocations use
calloc and some of the manual memset(..., 0, ...) is removed.
-- Marco
More information about the Digitalmars-d
mailing list