[Issue 3383] New: newVoid
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Oct  9 10:08:58 PDT 2009
    
    
  
http://d.puremagic.com/issues/show_bug.cgi?id=3383
           Summary: newVoid
           Product: D
           Version: 2.033
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Keywords: patch, performance
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: dsimcha at yahoo.com
--- Comment #0 from David Simcha <dsimcha at yahoo.com> 2009-10-09 10:08:58 PDT ---
D's new keyword for allocating dynamic arrays initializes the data to T.init. 
This is a perfectly reasonable safe default.  However, there should be an
obvious way to optimize this out if one is sure one doesn't need it, as there
is for static arrays.  Below is a proposed function, newVoid(), that should go
in std.array to allow such a thing.
import core.memory;
/**Gives the block attribute that a block containing type T should have,
 * i.e. scan or NO_SCAN.*/
GC.BlkAttr blockAttribute(T)() {
    if(typeid(T).flags & 1) {
        return cast(GC.BlkAttr) 0;
    } else {
        return GC.BlkAttr.NO_SCAN;
    }
}
unittest {
    assert(blockAttribute!(uint)() == GC.BlkAttr.NO_SCAN);
    assert(blockAttribute!(void*)() == cast(GC.BlkAttr) 0);
}
/**Returns a new array of type T w/o initializing elements.
 *
 * Examples:
 * ---
 * auto foo = newVoid!uint(5);
 * foreach(i; 0..5) {
 *     foo[i] = i;
 * }
 * ---
 */
T[] newVoid(T)(size_t length) {
    T* ptr = cast(T*) GC.malloc(length * T.sizeof, blockAttribute!(T)());
    return ptr[0..length];
}
unittest {
    // Mostly just see if this instantiates.
    auto foo = newVoid!uint(5);
    foreach(i; 0..5) {
        foo[i] = i;
    }
    foreach(i; 0..5) {
        assert(foo[i] == i);
    }
}
-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
    
    
More information about the Digitalmars-d-bugs
mailing list