Pop quiz [memory usage]

Sean Kelly sean at invisibleduck.org
Sat Jun 6 10:19:45 PDT 2009


Jarrett Billingsley wrote:
> On Sat, Jun 6, 2009 at 8:03 AM, Vladimir
> Panteleev<thecybershadow at gmail.com> wrote:
>> // Works for DMD1/Phobos, DMD1/Tango and DMD2/Phobos
>> version(Tango) import tango.io.Console;
>> else           import std.stdio;
>>
>> struct S
>> {
>>        ubyte[40_000] data;
>> }
>>
>> void main()
>> {
>>        S[] a;
>>        a ~= S();
>>
>>        // QUESTION: How much memory will this program consume upon reaching
>> this point?
>>        version(Tango) Cin.copyln();
>>        else           readln();
>> }
>>
> 
> There seems to be something wrong with the newCapacity function that
> _d_arrayappendcT calls.  From an element size of 20000 (I halved it
> just to make the allocation faster) and an array length of 1, it
> somehow calculates the new size to be 266686600.  Hm.  That seems a
> bit off.
> 
> It seems this line:
> 
> long mult = 100 + (1000L * size) / log2plus1(newcap);
> 
> is to blame.  I don't think large value types were taken into account
> here.  The resulting multiplier is 1,333,433, which is hilariously
> large.

I've been debating for a while whether newCapacity shoulds exist at all. 
  The GC already tends to leave free space at the end of blocks, so why 
should the runtime second-guess it?  Particularly in D2 where append 
operations on arrays are probably less common as a result of string 
being invariant.  I'll fix newCapacity and run some tests, depending on 
their result I may disable it entirely.



More information about the Digitalmars-d mailing list