[Issue 15581] New: foreach should not do bounds checking
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Mon Jan 18 11:10:01 PST 2016
    
    
  
https://issues.dlang.org/show_bug.cgi?id=15581
          Issue ID: 15581
           Summary: foreach should not do bounds checking
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: johannespfau at gmail.com
Consider this code:
----------------------------
void bar(ubyte data){}
void foo(ubyte[] data)
{
    foreach(entry; data)
    {
    bar(entry);
    }
}
void main(){}
----------------------------
dmd test.d
objdump -S test > test.s
We currently emit a bounds check for every element accessed by foreach. This
code should not generate any bounds checks at all. If we trust length to be
correct then all elements are in [0 .. length] and can't be out of bounds.
This problem was found in a murmurhash C++ => D port where it severely affected
performance. We had to fall back to pointer arithmetic+for loops to avoid the
generated bounds checks:
https://github.com/D-Programming-Language/phobos/pull/3916
--
    
    
More information about the Digitalmars-d-bugs
mailing list