在本地化缓存数据方面,是Java多维数组Col-Major还是Row-Major?

时间:2013-01-29 20:55:02

标签: java caching multidimensional-array

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

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

在java中,没有2d数组,但它仍然在高速缓存方面创建了类似的东西。我的问题是,它是否创建了行大小的实际数据数组,还是创建了行大小的指针数组?

或者,正如类似Stack Over线程上的最佳答案所说,它会做一些完全不同的事情,其中​​int [5] [8]将是一个5个指向任何大小的数组的数组,所有数组都加起来(5 * 8)?

它说java做了锯齿状的数组,我想不出有任何理由这样做。

1 个答案:

答案 0 :(得分:2)

  

在java中,没有2d数组,但它仍然会在缓存方面创建类似的东西

我不知道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];代替。