cloning arrays
Jonathan M Davis via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Sep 12 02:17:44 PDT 2016
On Monday, September 12, 2016 07:56:26 Russel Winder via Digitalmars-d-learn
wrote:
> On Sat, 2016-09-10 at 15:54 -0700, Jonathan M Davis via Digitalmars-d-
>
> learn wrote:
> > […]
> >
> > dup creates an array with mutable elements that are copies of what
> > was in
> > the original array. How deep a copy that is depends on the type. It
> > does
> > exactly as deep a copy as simply copying the element would do. e.g.
> >
> > […]
>
> Which raises the question of whether:
>
> x[]
>
> and
>
> x.dup
>
> have the same result.
They don't. For dynamic arrays,
auto y = x;
and
auto y = x[];
are identical save for constness. The first one results in y being a dynamic
array referring to exactly the same memory as x with exactly the same
constness, whereas the second results in y referring to the same memory, but
it's a tail-const version of x. e.g.
auto x = cast(immutable)[1, 2, 3, 4];
auto y = x;
auto z = x[];
static assert(is(typeof(x) == immutable(int[])));
static assert(is(typeof(y) == immutable(int[])));
static assert(is(typeof(z) == immutable(int)[]));
But regardless of the constness, x, y, z refer to exactly the same memory.
No memory is allocated, and none of the elements are copied.
If you do something like
y[] = x[];
then that would be equivalent to
y[0 .. $] = x[0 .. $];
and it would copy all of the elements of x into y, but it would require that
x and y be the same length, and it would not allocate any memory. It's just
copying the elements.
dup specifically allocates a new buffer, copies each of the elements of the
original array into that buffer, and then returns a dynamic array which is a
slice of that buffer referring to those elements. It does essentially the
same thing as
auto y = new int[](x.length);
y[] = x[];
except that that default-initializes all of the elements in y first, and
then copies over them, whereas dup should just copy them without doing the
default initialization first.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list