On 2013-02-02 22:57, FG wrote:
On 2013-02-02 22:33, Steven Schveighoffer wrote:
Heap block sizes start at 16.  One byte overhead is used to store the array
length, so the minimum size of ANY array allocation is 15 bytes.

How is the length stored because I see only strange numbers in that byte.

     foreach (end; 2..31) {
         ubyte[] x;
         foreach (i; 0..end) {
             x ~= cast(ubyte)i;
         }
         writeln(x.length, " ", x.capacity, " ", x.ptr[end]);
     }


Ah, sorry. Silly me.
I have figured out that the length byte would have to be aligned to the end
of the block, so that is where I should look. The updated code:

    // size_t ends = [1,2,7,15,31]; // crashes DMD
    foreach (end; 2..31) {
        ubyte[] x;
        foreach (i; 0..end) {
            x ~= cast(ubyte)i;
        }
        writeln(x.length, " ", x.capacity, " ", x.ptr[x.capacity]);
    }
    return;

shows that indeed, there's length written at the end. :)
Output:

2 15 2
3 15 3
4 15 4
5 15 5
6 15 6
7 15 7
8 15 8
9 15 9
10 15 10
11 15 11
12 15 12
13 15 13
14 15 14
15 15 15
16 31 16
17 31 17
18 31 18
19 31 19
20 31 20
21 31 21
22 31 22
23 31 23
24 31 24
25 31 25
26 31 26
27 31 27
28 31 28
29 31 29
30 31 30



Reply via email to