Setting array length to 0 discards reserved allocation?

Andrew Godfrey via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 1 22:33:13 PDT 2014


On Friday, 1 August 2014 at 21:36:14 UTC, Chris Cain wrote:
> 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.

Yes, I was a bit terse in my previous retraction (was low on 
time). I realized this is what the doc was actually saying. The 
edit in the PR stands, but my description of it as fixing an 
"error" is incorrect.
The language was just a bit confusing, perhaps.
I am unable to fix the PR description at the moment but that 
shouldn't prevent review of the PR itself.


More information about the Digitalmars-d mailing list