Array Design Idea

Jb jb at nowhere.com
Mon Dec 10 12:23:46 PST 2007


"Craig Black" <cblack at ara.com> wrote in message 
news:fjk5ra$11h6$1 at digitalmars.com...
>
> "Jb" <jb at nowhere.com> wrote in message 
> news:fjk5g9$10lb$1 at digitalmars.com...
>>
>> "Craig Black" <cblack at ara.com> wrote in message 
>> news:fjk2k6$pfl$1 at digitalmars.com...
>>
>>> There are three things that need to be stored for a resizable array: 
>>> the pointer to the array, the size, and the capacity.  My array 
>>> implementation, both the size and the capacity are stored on the heap 
>>> with the array.  There is only one heap allocation, and the first 8 
>>> bytes are reserved for the size and capacity values.  Further, there is 
>>> no heap allocation if the array is empty.  If the array is empty, then 
>>> the pointer is null, and the array is assumed to have a size and 
>>> capacity of zero, so there is no need to store the size or capacity of 
>>> an empty array.
>>
>> Thats how Delphi does dynamic arrays and strings. Well except that it has 
>> length & refcount rather than length & capacity. Wouldnt it break slicing 
>> though? You cant point halfway into an existing array and still have the 
>> length & capacity at -4,-8 bytes?
>
> I still haven't wrapped my head around the slicing issue.  Obviously it's 
> not an issue for C++ arrays.  Doesn't D already allocate the capacity of 
> the array on the heap?  If this is so why doesn't this break slicing?

>From looking at the docs it seems 'capacity' is a property of the heap 
allocated block, not the array. And arrays only try to take advantage of 
this capacity when they happen to point at the begining of the block. If you 
slice into an existing array, starting at > 0, then resizing that slize will 
always result in a copy.





More information about the Digitalmars-d mailing list