caching - D中缓存友好的多维数组迭代

标签 caching multidimensional-array d

我在D中有一个静态 3维数组,一般

Struct[WIDTH][HEIGHT][DEPTH] values;

其中两个维度达到数千。如果我想迭代这个数组以线性访问内存位置,应该在外循环中迭代哪个维度? WIDTH 还是 DEPTH?

最佳答案

外循环应该是DEPTH,如下程序所示:

import std.stdio;

void main() {
  enum X = 6, Y = 4, Z = 2;
  ubyte[X][Y][Z] root;

  foreach (i, ref level3; root) {
    foreach (j, ref level2; level3) {
      foreach (k, ref level1; level2) {
        writefln("%s %s %s: 0x%x", i, j, k, &level1);
      }
    }
  }   
}

打印出来:

0 0 0: 0x7fbfc8b9f0
0 0 1: 0x7fbfc8b9f1
0 0 2: 0x7fbfc8b9f2
0 0 3: 0x7fbfc8b9f3
0 0 4: 0x7fbfc8b9f4
0 0 5: 0x7fbfc8b9f5
0 1 0: 0x7fbfc8b9f6
0 1 1: 0x7fbfc8b9f7
0 1 2: 0x7fbfc8b9f8
0 1 3: 0x7fbfc8b9f9
0 1 4: 0x7fbfc8b9fa
0 1 5: 0x7fbfc8b9fb
0 2 0: 0x7fbfc8b9fc
0 2 1: 0x7fbfc8b9fd
0 2 2: 0x7fbfc8b9fe
0 2 3: 0x7fbfc8b9ff
0 2 4: 0x7fbfc8ba00
0 2 5: 0x7fbfc8ba01
0 3 0: 0x7fbfc8ba02
0 3 1: 0x7fbfc8ba03
0 3 2: 0x7fbfc8ba04
0 3 3: 0x7fbfc8ba05
0 3 4: 0x7fbfc8ba06
0 3 5: 0x7fbfc8ba07
1 0 0: 0x7fbfc8ba08
1 0 1: 0x7fbfc8ba09
1 0 2: 0x7fbfc8ba0a
1 0 3: 0x7fbfc8ba0b
1 0 4: 0x7fbfc8ba0c
1 0 5: 0x7fbfc8ba0d
1 1 0: 0x7fbfc8ba0e
1 1 1: 0x7fbfc8ba0f
1 1 2: 0x7fbfc8ba10
1 1 3: 0x7fbfc8ba11
1 1 4: 0x7fbfc8ba12
1 1 5: 0x7fbfc8ba13
1 2 0: 0x7fbfc8ba14
1 2 1: 0x7fbfc8ba15
1 2 2: 0x7fbfc8ba16
1 2 3: 0x7fbfc8ba17
1 2 4: 0x7fbfc8ba18
1 2 5: 0x7fbfc8ba19
1 3 0: 0x7fbfc8ba1a
1 3 1: 0x7fbfc8ba1b
1 3 2: 0x7fbfc8ba1c
1 3 3: 0x7fbfc8ba1d
1 3 4: 0x7fbfc8ba1e
1 3 5: 0x7fbfc8ba1f

请注意,地址以线性方式增加,并且变化最快的索引是 X。所以内循环代表X,外循环代表Z

关于caching - D中缓存友好的多维数组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416856/

相关文章:

d - 在 writefln() 之外连接 D 中字符串的最短方法?

reflection - 是否可以获取D中枚举成员的名称和值?

D中的多线程与for循环

nhibernate - NHibernate ICriteria 查询是缓存还是放在身份映射中?

javascript - 单页应用程序版本控制

java - Hibernate:如何急切地获取未关联的实体?

javascript - 如何获取多维数组中最长的单词?

ASP.NET MVC 与 WCF,缓存通知问题

c - 在 C 中访问多维字符串数组的元素

javascript - 如何在 JavaScript 中按多列对多维数组进行排序?