Array append proposal
Sergey Gromov
snake.scaly at gmail.com
Fri Oct 10 09:49:55 PDT 2008
Fri, 10 Oct 2008 12:28:02 -0400,
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.
Yes, I've got it from your first explanation, thank you. :)
More information about the Digitalmars-d
mailing list