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

In terms of localizing data for caches, are java multi-dimensional arrays Col-Major or Row-Major?

我在类似的堆栈溢出线程上找到了这个主题。

在C++中,当你制作一个数组int [i] [j]时,你会得到行主顺序,所以逐行迭代会给你提供更多有用数据的缓存。

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

或者,正如线程上类似堆栈上的顶级答案所说,如果int[5][8]是一个5个指针数组,指向所有大小的数组(5*8),它会做完全不同的事情吗?

它说Java制造了锯齿形数组,我想不出有什么好的理由来证明这是真的。


0

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

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

那就相当于:

1
2
3
4
5
6
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个独立的数组。在任何时候,你都可以写:

2

它只是一个数组——定义上参差不齐。没有什么可以说它将永远保持矩形,甚至"顶级"数组的所有元素都将是非空的。

我希望这些价值观在记忆中彼此接近,但并不能保证它们会保持这样。

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