Setting array length to 0 discards reserved allocation?

Chris Cain via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 1 14:36:13 PDT 2014


On Friday, 1 August 2014 at 07:51:32 UTC, Andrew Godfrey wrote:
> Going through other .dd files, I found an error in 
> expression.dd.
> It says "For static or dynamic arrays, identity is defined as 
> referring
> to the same array elements and the same number of elements."
>
> Well, in fact:
>
> unittest {
>     // expression.dd says that equality AND IDENTITY compare 
> elements and sizes, for both "static and dynamic arrays". Gaah!
>
>     int[] a = new int[3];
>     int[] b = new int[3];
>     assert(a == b);
>     assert(a !is b); // Nope! The doc is wrong!
>
>     // So then:
>
>     b = a;
>     assert(b is a); // Now b points to a, and 'is' does what 
> I'd expect.
>     // But evidently it's because it compared the array 
> references - not
>     // the elements and sizes!
> }
>
> I would NOT recommend updating the compiler to match what the 
> doc says.
> The current behavior is consistent with how assignment to an 
> array reference behaves.

I think the docs might can be cleared up in this regard, but from 
my reading, the docs are correct on this.

     int[] a = new int[3];
and
     int[] b = new int[3];

Do not refer to the same elements. They are two different 
allocations that happen to look alike and compare equal, but they 
aren't referring to the same point in memory.

To prove this, you can simply do `a[0] = 1;` ... did `b[0]` 
"change" as well? (No). Then they couldn't possibly have been 
referring to the same thing.

What the docs are saying by "referring to the same array elements 
and the same number of elements": basically, an array in D is 
simply a pointer + length struct. The `is` operator essentially 
does a bitwise compare, so naturally `a is b` only returns true 
when they are bitwise identical structs, which must mean they are 
the same in both pointer and in length, which naturally means 
that `a == b` as well. There's no need to compare elements since 
there's no way something doesn't equal itself unless some weird 
trickery is going on (concurrent modification?).

You can imagine `is` to mean `a.ptr == b.ptr && a.length == 
b.length` (or that they refer to the same array and they have the 
same number of elements), but implemented in what is probably a 
more efficient manner.


More information about the Digitalmars-d mailing list