http://d.puremagic.com/issues/show_bug.cgi?id=10589


Rainer Schuetze <r.sagita...@gmx.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |r.sagita...@gmx.de


--- Comment #1 from Rainer Schuetze <r.sagita...@gmx.de> 2013-07-12 13:37:39 
PDT ---
I think you are mixing two levels of abstractions here:

        ubyte*  p = cast(ubyte*)GC.malloc(i, GC.BlkAttr.APPENDABLE);
        ubyte[] s = p[0 .. 0];
        writefln("%6s: s.capacity  is %6s", i, s.capacity);

GC.malloc requests raw memory from the GC. capacity is a function very specific
to the way arrays are implemented on top of it in rt/lifetime.d. It assumes
that any allocation with bit APPENDABLE set and that is larger than a page of
4kB reserves 16 bytes at the start of the allocation to store the actually used
length of the memory.

So, to create an empty array manually that works with capacity, you'd have to
set s to

   auto start = i <= 2048 ? 0 : 16;
   ubyte[] s = p[start .. start];

and you'd better clean that full memory block first to avoid the length field
containing garbage.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to