D语言:初始化动态多维数组最佳实践?

时间:2011-12-14 10:29:55

标签: multidimensional-array d

只是好奇这是否是在D中初始化动态多维数组的最佳实践。在他们的语言参考中有一个关于数组的部分,但我不确定它是否超出了我想要完成的任务。

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

(或类似的替代方案,如典型的(y = 0; y< height; y ++)循环)。

我对此的关注是它分别重新分配数组的每一行而不是整个数据块,所以我不知道这是否会导致内存混乱太多。此外,我相信它不能保证是连续的(因为 tiles 在这种情况下只是一个指针数组)。有没有“更好”的方法来做到这一点(不涉及使用一维数组并自己计算索引)?据我所知,从文档中可以看到一个连续的多维数组只能在编译时用不可变维度声明,只是想知道我是否遗漏了某些东西......

2 个答案:

答案 0 :(得分:17)

你可以 new 数组,至少在D2中是这样的:

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

我相信这是最好的做法。

答案 1 :(得分:3)

你可以通过malloc预先提出你需要的所有东西来捏造它

this(uint width, uint height) {
    void* p = enforce(GC.malloc(Tile.sizeof*width*height),new OutOfMemoryException);
          //allocate all rows at once, throw on returned null
    tiles.length = height;
    foreach (i,ref tilerow; tiles)
        tilerow = cast(Tile[])p[Tile.sizeof*width*i..Tile.sizeof*width*(i+1)];
                //slice it into the multidimensional array
}

编辑或使用临时数组来保持下摆更清洁/更少的bugprone代码(即隐藏malloc)

this(uint width, uint height) {
    Tile[] p = new Tile[height*width]
    tiles.length = height;
    foreach (i,ref tilerow; tiles)
        tilerow = p[width*i..width*(i+1)];
                //slice it into the multidimensional array
}