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制造了锯齿形数组,我想不出有什么好的理由来证明这是真的。
- docs.oracle.com JavaSE教程Java / / / / / zwnj nutsandbolts arrays.htm &;& # 8203;L
- 只要我知道,Java的二维数组有相同的C / C + +是作为1维阵列,阵列。如果有人有一个说的资源,否则,请邮寄它。
- alexdicarlo率"到"链接:Java编程语言是一个简单的多元阵列,阵列阵列组件是其自身。这是一个不同的数组在C或Fortran。
- 每一个"凯泽资源我现在看着它说一个简单的Google搜索数组在C / C + +相同的方式工作。在这里的例子。
- "你说的Calexdicarlo率是约C++,链接。我就是引证正式文档。
- 我知道你只是"凯泽引证,因为我replying引证正式文档不一定意味着它是正确的信息。所以,我没有链接源为C A,因为我不想和googleable链接一堆东西,例如第一个搜索结果的"多维数组在C"。
- "我不想你去攻击,想找出如果这是恰当的或只是一个普通的东西我失踪。
- 当然,如果alexdicarlo困境""有什么不方便的事情googable"困境:P的感觉袭击了我。我认为可以与差分画报"行"的事实,可以在Java中的不同的长度。
- 如果你是一个主要关注的性能,如果"这包含更多有用的数据缓存到缓存"你是指我想a Java性能阵列阵列的性能特性的要求是类似于C + +的二维数组。阅读两大阶行收益最好的地方想的空间,从一个给定的行元素,将在靠近彼此的记忆。唯一的区别是,C + +的二维数组有一个额外的行的端部的物业,想在下一个元素的下一行中的第一个记忆。
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];。
- 这和C/C++不一样吗?
- @亚历克迪卡洛:我不确定,但我很确定这不是手术所期望的。我将编辑以澄清这一点。
- 大多数与C/C++完全不同。在那里,二维数组是实数数组,而不是数组引用数组。
- @吉米加里森,你能联系到一个消息来源吗?这个C++源代码和C语言的另一个声明。(或者一个简短的解释就可以了)
- 我不是积极的,但我认为不同的是,在C++中,数组是彼此相邻的,基本上像一个大数组。这对我来说很有意义,因为使用数组而不是列表的目的是本地化数据。
- 另外,谢谢乔恩。我想你明白了。最好是逐列迭代5行,而不是逐行迭代8列。尤其是因为可能根本就没有8列。我实际上在代码中把它弄乱了一些,随意地做,可能会让我的速度损失很多。
- @拇指:是的,在一个数组中迭代可能更好…但我怀疑这会让你损失很多速度。我仍然建议您首先编写最易读的自然代码和基准代码,以确定性能是否足够。