proposal: capacity variable for dynamic arrays
Ameer Armaly
ameer_armaly at hotmail.com
Mon Jul 10 09:56:38 PDT 2006
"Oskar Linde" <oskar.lindeREM at OVEgmail.com> wrote in message
news:e8tvq5$1i3d$1 at digitaldaemon.com...
> Ameer Armaly skrev:
>> Right now dynamic arrays use length to resize and handle memmory
>> allocation. This is a bit limiting as far as the old memmory reservation
>> problem as well as a few other things. What I propose is adding a new
>> variable called capacity, which handles the actual memmory allocation and
>> using length for the accepted size of the array. Here are a few code
>> fragments to show how it would work:
>>
>> char[] string = new char[1024];
>> assert(string.length==1024 && string.capacity=1024);
>> string.length=0; // we've reserved memmory, but haven't freed it
>> version(break) writefln(string[1..4]); // throws a bounds exception,
>> since length is zero
>> string.capacity = 1300; // traditional resize with a different variable,
>> will be set to whatever the true capacity is
>> string.length = 2048; // would still work, since length is greater than
>> capacity so it acts the same way. However, capacity would be the actual
>> amount of memmory reserved by the malloc algorithm, in this case doubling
>> the size of the array.
>> string.capacity = 0; // freed
>>
>> In short, this solves the problem of reserving memmory with little cost,
>> while maintaining backwards compatibility. It could also be used in the
>> stream and socket code, where the actual capacity doesn't change but the
>> length does, removing the need for a separate size variable, something
>> like this:
>>
>> char[] buf = new char[1024];
>> buf.length = 0;
>> Socket s;
>> // set up the socket
>> s.read(buf); // Length is set to the actual data, but capacity is the
>> same. This way the array is truely dynamic.
>>
>> Thoughts?
>
> Where would the capacity value be stored? Today the capacity is (as far as
> I understand) stored by the GC in correspondance to the the allocated
> chunk of memory.
>
> What could be done is having a virtual .capacity property that when set to
> a value makes sure the capacity is /at least/ the value set and returns
> the actual capacity when read. So for example after doing
> arr.capacity = 1024;
> arr.capacity could be something at least 1024, like probably 2047.
>
Sounds good to me, especially since that means no redundant variables. What
I see capacity as holding is the maximum amount of elements I can put in
this array _without_ any new allocations.
> /Oskar
More information about the Digitalmars-d
mailing list