deep copy or shallow copy?

Timon Gehr timon.gehr at gmx.ch
Fri Dec 9 13:09:15 PST 2011


On 12/09/2011 09:32 PM, Ali Çehreli wrote:
> On 12/08/2011 12:52 PM, Timon Gehr wrote:
>  > On 12/08/2011 09:50 PM, RenatoL wrote:
>  >> snippet 1)
>  >> auto arr1 = [1,2,3];
>  >> auto arr2 = arr1;
>  >> arr1[1] = 22;
>  >> arr2[2] = 33;
>  >> foreach (i; 0..arr1.length) write(arr1[i], " ");
>  >> writeln();
>  >> foreach (i; 0..arr2.length) write(arr2[i], " ");
>  >>
>  >> output:
>  >> 1 22 33
>  >> 1 22 33
>  >> OK
>  >>
>  >> snippet 2)
>  >>
>  >> int[3] arr1 = [1,2,3];
>  >> int[3] arr2 = arr1;
>  >> arr1[1] = 22;
>  >> arr2[2] = 33;
>  >> foreach (i; 0..arr1.length) write(arr1[i], " ");
>  >> writeln();
>  >> foreach (i; 0..arr2.length) write(arr2[i], " ");
>  >>
>  >> output:
>  >>
>  >> 1 22 3
>  >> 1 2 33
>  >>
>  >> that's unclear to me... i "agree" with the behaviour of the
>  >> dynamic array... but if we have a static array we have a deep copy?
>  >
>  > Both copies are 'shallow', but static arrays are value types.
>
> 'shallow' would be misleading for a fixed-length (static) array because
> there is nothing else but the elements for fixed-length arrays:

It is not misleading since the array might be an array of references. 
(and if it does not contain references, shallow and deep are the same 
thing anyway)

>
> void main()
> {
> int[3] a;
> assert(cast(void*)&a == cast(void*)&a[0]);
> }
>
> Fixed-length array storage is similar to C arrays. These are different:
>
> - they don't decay to a 'pointer to first element' when passed to
> functions (being value types, the whole array is copied)
>
> - a.length is a convenience, equivalent to a.sizeof / a[0].sizeof
>
> So it is impossible to do anything shallow with them unless we
> explicitly maintain a pointer to a fixed-length array ourselves.
>
> Ali
>

You can always slice it, of course

int[3] a;
int[] b = a[]; // b now is a dynamic array that aliases a's contents




More information about the Digitalmars-d-learn mailing list