Array append proposal

Steven Schveighoffer schveiguy at yahoo.com
Fri Oct 10 09:28:02 PDT 2008


"Steven Schveighoffer" wrote
> "Sergey Gromov" wrote
>> Fri, 10 Oct 2008 11:11:40 -0400,
>> Steven Schveighoffer wrote:
>>> First, store the allocated length of the array on the heap along with 
>>> the
>>> array data.  On a 32-bit system, the size will always be 4 bytes, but 
>>> there
>>> can be padding bytes added to keep the alignment for the first element 
>>> in
>>> the array correct.  The maximum padding, I am not sure about.  I 
>>> remember
>>> people saying that for certain operations, 16 byte alignment is 
>>> required?
>>> Or is it just 8?  So for instance an array of doubles, there would be an
>>> 8-byte field storing the length in the first 4 bytes, and padding in the
>>> second 4 bytes.
>>>
>>> Perhaps someone with more knowledge of alignment requirements can 
>>> comment.
>>> I'd also appreciate some insight on how this would look on a 64 bit 
>>> system.
>>>
>>> The final detail is how to tell whether the element before an array is 
>>> the
>>> length or not.  I propose to use the most significant bit in the array
>>> length field.  This prevents having arrays of > 2GB, but that's probably
>>> impossible anyways ;)
>>>
>>> If this bit is set, then the array can be appended to in place if its 
>>> length
>>> equals the length stored in the heap (and of course, the memory block
>>> contains enough space).  If not, then a new array is allocated, and the 
>>> data
>>> copied, the length stored in the heap is left alone.
>>
>> How do you implement a slice?  It points in the middle of another array,
>> data around that point is arbitrary.  There is no way you can check if
>> you are at the beginning of an array or not.
>
> If the first element of the slice is not the first element of the 
> allocated array, then it does not have its 'at the beginning' bit set in 
> its local length.

An example:

int[] array = new int[10];

array's length field is set to 0x8000_000a -> most significant bit set means 
it can possibly be appended to.

int[] slice = array[0..$];

slice's length field is set to 0x8000_000a -> most significant bit set means 
it can possibly be appended to.

int[] slice2 = array[1..5];

slice2's length field is set to 0x0000_0004 -> most significant bit unset. 
Will always allocate a new array on an append.

-Steve






More information about the Digitalmars-d mailing list