Pop quiz [memory usage]

Vladimir Panteleev thecybershadow at gmail.com
Sat Jun 6 08:45:21 PDT 2009


On Sat, 06 Jun 2009 18:12:58 +0300, Jarrett Billingsley  
<jarrett.billingsley at gmail.com> 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.

Bulls-eye. I think mr. Dave Fladebo deserves a math lesson or something,  
and mr. Walter Bright should review patches that go into the language's  
runtime more carefully. :P

Can we discuss a suitable replacement? I suggested in #d that we look at  
how other platforms do it. For example, Java's Vector just doubles its  
capacity by default (  
http://java.sun.com/javase/6/docs/api/java/util/Vector.html ).

-- 
Best regards,
  Vladimir                          mailto:thecybershadow at gmail.com



More information about the Digitalmars-d mailing list