Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

D language: initializing dynamic multidimensional array best practices?

Just curious if this is the best practice for initializing a dynamic, multidimensional array in D. There is a section on arrays in their language reference, but I'm not quite sure if it goes over what I'm trying to accomplish.

class Map {
    Tile[][] tiles;

    this(uint width, uint height) {
        tiles.length = height;
        foreach (ref tilerow; tiles)
            tilerow.length = width;
    }
}

Map map1 = new Map(5000, 3000); // values determined at runtime

(or an equivalent alternative like a typical for (y=0;y<height;y++) loop).

My concern with this is that it reallocates each row of the array separately rather than the whole chunk all at once, so I don't know if this will lead to too much memory shuffling. Also, I believe it's not guaranteed to be contiguous (since tiles is just an array of pointers in this case). Is there any "better" way to do this (that doesn't involve using a single-dimensional array and computing the index myself)? As far as I can tell from the docs a contiguous multidimensional array can only be declared with immutable dimensions at compile time, just wondering if I'm missing something...

like image 838
ccjuju Avatar asked Dec 14 '11 10:12

ccjuju


1 Answers

You can new the array, at least in D2:

Tile[][] tiles = new Tile[][](height, width);

I believe this is the best practice.

like image 194
Justin W Avatar answered Oct 30 '22 11:10

Justin W