d2:通过new分配数组和分配数组文字之间的区别

时间:2012-03-27 20:22:53

标签: d

请考虑以下代码:

class C {
    immutable(double[][]) data;

    this() {
        immutable(double[])[] blocks = [];
        immutable(double)[] block;

        foreach (x; 0 .. 5) {
            block = [];

            block ~= 0.1 * x;
            block ~= 1.0 * x;
            block ~= 10.0 * x;

            blocks ~= block;
        }

        this.data = blocks;
    }
}

它简化了我的代码的“干提取”,用数组填充数组数组。这段代码片段按预期工作,但由于我是D的新手,我不确定我是否做得对。

数组文字的分配是否实际上以正确的方式分配内存,或者最好使用new double[0]之类的内容?在重新分配相同的文字时是不是有一些注意事项?

2 个答案:

答案 0 :(得分:1)

分配空文字与分配给null具有相同的效果。它不分配任何内存。当您进入“阻止”时,分配就会发生。这导致数组重新分配三次,我认为如果值是静态知道的,它可以进一步优化。无论如何,我可能只用3个元素预先分配“块”,然后在每次迭代时分配相应的元素并将其连接成“块”(它将在此处执行复制)。我希望你不会静态地知道“x”的值。如果这样做,您也可以静态初始化“块”的容量。

答案 1 :(得分:1)

分配[]不会分配任何内容。它与分配null或根本不初始化动态数组相同。它使得数组的length 0ptrnull。只有当数组的ptr属性为非零时,它才有任何分配给它的内存。

按照目前的情况,你也可以将block的声明移到你指定它的行[]并删除作业。就目前而言,你不必要地一遍又一遍地重复使用这个变量。因为,它只在循环中使用,这是它应该存在的唯一地方。

如果您希望减少在追加数组时额外重新分配数组的几率,请使用reservestd.array.appender

你真的应该阅读D中的this article或数组。你应该对你理解数组如何在D中工作有很大的帮助。