D Multidimensional arrays wierdness

Adam D. Ruppe via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Aug 28 20:37:14 PDT 2017


On Tuesday, 29 August 2017 at 03:16:13 UTC, Johnson Jones wrote:
> T[] arr
>
> and is a linear sequential memory array of T's with an unbound 
> length and is effectively the same as T*(although D treats them 
> differently?)?


It is a T* AND a size variable bundled together.

> We can fix the length by adding a upper bound:
>
> T[N] arr;

That's actually an entirely different type. This is now a block 
of static memory instead of a pointer+length combo.

> and this is equivalent to
>
> auto arr = cast(T[])malloc(T.sizeof*N)[0..N];

No, it isn't. The static array T[N] has no such allocation, it is 
all in-place.

> Now, when it comes to multidimensional arrays:
>
> T[][] arr;

That's an array of arrays. A pointer+length combo to a bunch of 
other pointer+length combos.

> or, lets used a fixed array so we can be clear;
>
> T[N][M]
>
> which means we have M sequential chunks of memory where each 
> chunk is a T[N] array.

That's correct though, with the caveat that there's no padding 
between the inner arrays; the T[N][M] is a single block of memory 
with size N * M * T.sizeof.

> Similary, to access the element at the nth element in the mth 
> chunk, we do
>
> t[n][m] because, again, this conforms with out we think of 
> single arrays.

I've never understood how anyone thought that made any sense. I 
have always thought C was backwards and illogical for that 
nonsense and even after many years of using C, I'd still often 
get it "backwards".

D doing the sane thing and having consistent order is one of the 
things I like about the language.



> T[N][M]
>
> one must access the element as
>
> t[m][n]!
>
> The accessors are backwards!

What is t[m]? It gets the m'th element of t, right? Well, since t 
is an array of N items, it makes perfect logical sense that t[m] 
is is of type T[N].

Just like how T[N]* is a pointer to a T[N] (which is an array of 
T), or if it were a function, t(n) would be its return value. D 
always follows this simple recursive rule.



Now, what's important about all this is the built-in things are 
arrays of arrays rather than multi-dimensional arrays. D also 
supports multi-dimensional arrays, which are indexed: T[x, y].

The actual type of them is not built into the language though - 
it needs to be defined as a library type. I'm not sure it ever 
got into phobos but it is available here: 
https://github.com/libmir/mir-algorithm

Or you can write your own pretty quickly with a static array + 
the opIndex overload.


More information about the Digitalmars-d-learn mailing list