Where can find fix length array memory layout document

XavierAP n3minis-git at yahoo.es
Thu Jun 20 07:58:36 UTC 2019


On Tuesday, 18 June 2019 at 12:26:14 UTC, lili wrote:
> Hi guys:
>    Is the Dlang fix-length array alloc on stack?  when a test
>     writeln([1]).sizeof //16
>     writeln([2]).sizeof //16
>     Why, What is the fix-length array memory layout.

You are quite confused...

[...] is an array literal, not a static array. Those aren't the 
same thing.

When you pass a array literal anywhere in your code, it will in 
principle be referred as a slice variable. This will not 
reallocate the contents. However the slice reference is another 
variable that takes up two words of space (see code below).

This slice type is the same variable type that stores dynamic 
arrays -- be they allocated or null.

Array literals are not necessarily allocated. The compiler is 
free to embed them into the program machine code itself.

If you want a static array, you can just declare it directly e.g. 
int[n] arr. Of course you can also generate is out of an array 
literal with the staticArray std library function.

PS the layout of D arrays is of course linear and contiguous. 
Both static or dynamic, just like C/C++ static arrays or 
std::vectors respectively.

Hopefully this code makes things clear:

/*********/
enum lenInts = int.sizeof;
static assert(lenInts == 4);

int[1] arrStatic;
static assert(lenInts == arrStatic.sizeof);

auto slice = arrStatic[];
alias sliceType = typeof(slice);
static assert(is(sliceType == int[]));

enum lenPointers = size_t.sizeof; // fyi (unsinged) pointers
static assert(ptrdiff_t.sizeof == lenPointers); // fyi signed 
pointer diff

static assert(sliceType.sizeof == 2 * lenPointers);
// because a D array reference remembers a pointer (like C) plus 
the length (stored in a word-length integer)



More information about the Digitalmars-d-learn mailing list