【问题标题】:In terms of localizing data for caches, are java multi-dimensional arrays Col-Major or Row-Major?在本地化缓存数据方面,java多维数组是Col-Major还是Row-Major?
【发布时间】:2013-01-13 13:33:41
【问题描述】:

我在a similar Stack Overflow thread找到了这个话题。

在 C++ 中,当你创建一个数组 int[i][j] 时,你会得到行的主要顺序,因此逐行迭代会给你提供包含更多有用数据的缓存。

在 java 中,没有二维数组,但它仍然在缓存方面创建了足够相似的东西。我的问题是,它是创建行大小的实际数据数组,还是创建行大小的指针数组?

或者,正如类似 Stack Over 线程上的最佳答案所说,它是否会做一些完全不同的事情,其中​​ int[5][8] 将是一个由 5 个指针组成的数组,这些指针指向任意大小的数组,它们的总和为 (5 *8)?

它说 java 制造了锯齿状数组,我想不出任何好的理由来证明这是真的。

【问题讨论】:

  • 据我所知,Java 具有与 C/C++ 相同的二维数组,一维数组的数组。如果有人有其他说明的资源,请发布。
  • @AlexDiCarlo 引用链接:“在 Java 编程语言中,多维数组只是一个数组,其组件本身就是数组。这与 C 或 Fortran 中的数组不同。”我>
  • @Keyser 我刚才通过简单的谷歌搜索快速查看的每个资源都说 C/C++ 中的数组以相同的方式工作。例如,请参阅here
  • @AlexDiCarlo 引用说C,你的链接是关于C++。我只是引用官方文档。

标签: java caching multidimensional-array


【解决方案1】:

在 java 中,没有二维数组,但它在缓存方面仍然创建了足够相似的东西

我不知道 C++ 的行为,但听起来你在期待 Java 行为中的某些东西,但很可能并非如此。如果你写:

int[][] x = new int[5][8];

那么这就相当于:

int[][] x = new int[5][];
x[0] = new int[8];
x[1] = new int[8];
x[2] = new int[8];
x[3] = new int[8];
x[4] = new int[8];

这里有 6 个独立的数组。在任何时候,你都可以写:

x[2] = new int[10000];

只是一个数组数组 - 根据定义jagged。没有什么可以说它会永远保持矩形,甚至“顶级”数组的所有元素都将是非空的。

我希望这些值在内存中开始彼此接近,但不能保证它们会保持这种状态。

如果你真的想确保你有一个连续的内存块,你应该改用int[] x = new int[40];

【讨论】:

  • 这和C/C++不一样吗?
  • @AlexDiCarlo:我不确定,但我很确定这不是 OP 所期望的。我将进行编辑以澄清这一点。
  • 绝对不同于 C/C++。那里的二维数组是真正的数组,而不是数组引用的数组。
  • @JimGarrison 你能链接来源吗? C++ 的这个来源和C 的这个来源,否则声明。 (或者简短的解释就可以了)
  • 我并不肯定,但我认为不同之处在于,在 C++ 中,数组彼此相邻,基本上就像一个大数组。这对我来说很有意义,因为使用数组而不是列表的目的是本地化数据。
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2018-06-01
  • 2022-11-27
相关资源
最近更新 更多