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