Array bound checks removal increasing importance

bearophile via Digitalmars-d digitalmars-d at puremagic.com
Sat May 31 06:10:32 PDT 2014


Wanderer:

>> void main() {
>>    int[5] data;
>>    foreach (const i; 0 .. 10)
>>        data[i] = 0;
>>    foreach (immutable i; 0 .. 10)
>>        data[i] = 0;
>>    int[10] big;
>>    foreach (const i, x; big)
>>        data[i] = x;
>> }
>
> I'm not sure if bound checks should be removed here. Before 
> removal, this code gives safe runtime exception, or, as 
> suggested above, compile-time error.

The compiler should catch all those cases at compile-time :-)


>> But the compiler must recognize this as correct code:
>>
>>
>> void main() {
>>    int[5] data;
>>    foreach (const i; 0 .. 10)
>>        if (i < 5)
>>            data[i] = 0;
>> }
>
> My personal opinion is that code like this should remain 
> inefficient, to stimulate programmers to use simpler, easier to 
> understand idioms, like foreach (i; data).

Java already removes several bound checks but this only increases 
the array access performance, so it's not easy to see, unless you 
do benchmarks (or in D compare the run-time with the run-time 
with disabled array bound tests). So I don't think this compiler 
improvement is going to worsen the D code you will see around :-)

Bye,
bearophile


More information about the Digitalmars-d mailing list