Array append proposal

Steven Schveighoffer schveiguy at yahoo.com
Fri Oct 10 10:04:54 PDT 2008


"KennyTM~" wrote
> Steven Schveighoffer wrote:
>> "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
>>
>>
>>
>
> That means the highest bit of .length will be set (not visible to coder of 
> course) if the array is of the form [x..$] right?

No, only if x is 0.  Because if x is nonzero, then the memory before the 
first element is not the heap-stored length.  This is one drawback I should 
have mentioned, you can't successfully append to a slice that is at the end 
of a memory block.  But you can't do that today, either.

-Steve 





More information about the Digitalmars-d mailing list