请考虑以下代码:
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]
之类的内容?在重新分配相同的文字时是不是有一些注意事项?
答案 0 :(得分:1)
分配空文字与分配给null具有相同的效果。它不分配任何内存。当您进入“阻止”时,分配就会发生。这导致数组重新分配三次,我认为如果值是静态知道的,它可以进一步优化。无论如何,我可能只用3个元素预先分配“块”,然后在每次迭代时分配相应的元素并将其连接成“块”(它将在此处执行复制)。我希望你不会静态地知道“x”的值。如果这样做,您也可以静态初始化“块”的容量。
答案 1 :(得分:1)
分配[]
不会分配任何内容。它与分配null
或根本不初始化动态数组相同。它使得数组的length
0
和ptr
为null
。只有当数组的ptr
属性为非零时,它才有任何分配给它的内存。
按照目前的情况,你也可以将block
的声明移到你指定它的行[]
并删除作业。就目前而言,你不必要地一遍又一遍地重复使用这个变量。因为,它只在循环中使用,这是它应该存在的唯一地方。
如果您希望减少在追加数组时额外重新分配数组的几率,请使用reserve
或std.array.appender
。
你真的应该阅读D中的this article或数组。你应该对你理解数组如何在D中工作有很大的帮助。