Empty Array is Null?

Frits van Bommel fvbommel at REMwOVExCAPSs.nl
Wed Mar 19 12:17:09 PDT 2008


Steven Schveighoffer wrote:
> "Frits van Bommel" wrote
>> Actually, if you compare an array to null (using 'is') DMD performs an 
>> 'or' instruction on the .ptr and .length and tests for the flag that it 
>> sets if the result is zero. This is just an optimization; this is 
>> equivalent to checking if both .ptr and .length are 0 (though presumably 
>> faster, since it's a single instruction that doesn't even implement full 
>> comparison).
> 
> Huh?  Why does it do that?  If you have a null pointer, then clearly the 
> length should be 0.  An optimization in my mind would be to just replace 
> array is null to array.ptr is null.  Is there a good reason to have a null 
> pointer array with a non-zero length?

Indeed, no program should be able to get a non-empty array with .ptr == 
null. However, it appears the compiler currently doesn't use that as an 
optimization opportunity. Maybe even only because Walter didn't think of 
it, or just because it doesn't really save that much and it isn't worth 
the trouble of checking if one of the values is known to be null at 
compile time.
The 'or' is itself an optimization that only applies when comparing to a 
0-length null array, but this optimization may well be implemented 
completely in the compiler backend which doesn't know that the length 
should always be null if the pointer is; it may only know that it needs 
to compare these two numbers against those other two numbers and jump 
based on the result...

>>> The sucky part about all this is that if you have an empty array where 
>>> the pointer is NOT null, then you get a different result (that array is 
>>> not considered to be null)
>> Actually, 'array == null' should return true for any empty array. Testing 
>> arrays with 'is' explicitly requests comparing .ptr and .length directly, 
>> not paying any attention to the contents; 'is' checks for identity, '==' 
>> for equivalence.
> 
> I would guess that the newest D compiler would not allow that, since 
> comparing to null is now an error except for using 'x is null'
> 
> Of course, this is another guess, since I haven't downloaded the new 
> compiler yet :)

I'm pretty sure it's only an error when comparing class instances. It 
shouldn't be an error to compare pointers or arrays against null. 
(There's no reason for it to be since they don't use vtables)


More information about the Digitalmars-d-learn mailing list