我想知道c ++和java中数组之间的性能差异。我知道对于java中的对象数组,对象不是连续存储在内存中,只是连续存储指向这些对象的指针。对于像int这样的原始类型呢?据我所知,JVM不保证数组将连续存储。我基本上想知道java和c ++之间原始数组性能的主要区别。绑定检查是否也在减慢java中的数组中起作用?
答案 0 :(得分:1)
据我所知,JVM并不能保证数组会连续存储。
虽然我没有看到任何铸铁保证数组元素将连续存储,但我相信它们将适用于所有主流实现。对于原始类型,原始值直接存储 - 而不是引用。据我所知,所有主流实现都包装数组 - 所以如果你有一个byte[]
,它就不会在4或8字节边界上对齐每个字节(因此需要的空间乘以4或8)。但是boolean[]
值不包含单个位(在我使用的实现中) - new boolean[n]
占用的空间与new byte[n]
相同。
答案 1 :(得分:1)
有几点需要注意:
int[][]
,那么每个层将是连续的,但是两个连续的层可能不是。这会产生性能开销,因为查找值并不是一个简单的比例并添加。所有这一切都说明,有两件事情可以使这一切问题比你想象的要少。首先,对于迭代数组中所有元素的典型情况,您不会遇到太多问题。绑定非常简单,甚至可以通过JIT编译器进行优化,JIT编译器非常适合优化紧密循环。另一方面,到目前为止,对阵列进行大量处理的最重要问题是渐近复杂度,它不受上述任何影响。因此,尽管Java总体上较慢,但您仍然会发现C中的冒泡排序远比Java中的mergesort慢很多。
需要注意的另一个关键事项是,很多内容可以帮助您并确保安全编码。当然,用Java编写垃圾是可能的,但是用C语言编写垃圾会更容易:超出数组的末尾,没有人会阻止你进入垃圾场。