Pop quiz [memory usage]

Fawzi Mohamed fmohamed at mac.com
Mon Jun 8 08:34:43 PDT 2009


On 2009-06-08 15:55:26 +0200, Sean Kelly <sean at invisibleduck.org> said:

> Fawzi Mohamed wrote:
>> On 2009-06-07 10:47:47 +0200, Christian Kamm 
>> <kamm-incasoftware at removethis.de> said:
>> 
>>> bearophile wrote:
>>> 
>>>>> The following code even crashes LDC during the compilation, I'll ask in
>>>>> the LDC channel:<
>>>> 
>>>> The good ChristianK has already added it:
>>>> http://www.dsource.org/projects/ldc/ticket/320
>>> 
>>> And thankfully Frits van Bommel has already fixed it: it consumes about 40kb
>>> of heap memory at runtime now.
>>> 
>>> This seems to be because we don't use the _d_arrayappend functions at all
>>> but emit a _d_arraysetlength instead. What's the memory growing behavior of
>>> that function? Should this be considered a bug?
>> 
>> I would say that setlength should not allocate extra space, because one 
>> should trust that the user knows his needs
> 
> char[] x;
> x.length = 100; // setlength allocates memory

I thought it was clear that I meant that (apart some rounding up done 
by the gc), the allocation created by x.length should no allocate 
*extra* space (meaning more that needed), because it is quite clear 
that the user wants that much space, and the likelihood that he doesn't 
really know, and some extra space would be good is not so high.
Thus adding space would most likely be wasted.

If the user appends to an array, and reallocation is needed on the 
other hand, the probability that that array will be appended again is 
much higher, so it makes sense to allocate some extra space. This makes 
continuously appending to an array perform O(log(N)) reallocations.

In any case I fixed the newCapacity function in tango, with one of my 
guesses for a good function.
But if anybody comes with some benchmarks that suggest and improvement 
I will gladly do it.

Fawzi




More information about the Digitalmars-d mailing list