我在a similar Stack Overflow thread上找到了这个主题.
在 C++ 中,当你创建一个数组 int[i][j] 时,你会得到行主序,因此按行迭代将为你提供包含更多有用数据的缓存。
在java中,没有二维数组,但它仍然在缓存方面创建了足够类似的东西。我的问题是,它是创建行大小的实际数据数组,还是创建行大小的指针数组?
或者,正如类似 Stack Over 线程上的最佳答案所说,它是否会做一些完全不同的事情,其中 int[5][8] 将是一个由 5 个指针组成的数组,这些指针指向任意大小的数组,所有数组的总和为 (5 *8)?据说 java 会产生锯齿状数组,但我想不出任何充分的理由来证明这一点。
最佳答案
In java, there is no 2d array, but it still creates something similar enough in terms of caches
我不知道 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];
。
关于java - 就缓存的本地化数据而言,java多维数组是Col-Major还是Row-Major?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592081/