java与C ++中的原语数组

时间:2014-10-11 07:44:43

标签: java c++ arrays performance

我想知道c ++和java中数组之间的性能差异。我知道对于java中的对象数组,对象不是连续存储在内存中,只是连续存储指向这些对象的指针。对于像int这样的原始类型呢?据我所知,JVM不保证数组将连续存储。我基本上想知道java和c ++之间原始数组性能的主要区别。绑定检查是否也在减慢java中的数组中起作用?

2 个答案:

答案 0 :(得分:1)

  

据我所知,JVM并不能保证数组会连续存储。

虽然我没有看到任何铸铁保证数组元素将连续存储,但我相信它们将适用于所有主流实现。对于原始类型,原始值直接存储 - 而不是引用。据我所知,所有主流实现都包装数组 - 所以如果你有一个byte[],它就不会在4或8字节边界上对齐每个字节(因此需要的空间乘以4或8)。但是boolean[]值不包含单个位(在我使用的实现中) - new boolean[n]占用的空间与new byte[n]相同。

答案 1 :(得分:1)

有几点需要注意:

  1. 基元数组在Java中连续存储,至少在标准JVM中存储。但是,多维数组不一定是连续的:如果你有一个int[][],那么每个层将是连续的,但是两个连续的层可能不是。这会产生性能开销,因为查找值并不是一个简单的比例并添加。
  2. 绑定检查对于JVM沙盒是必不可少的,因此没有什么可以做到关闭它,是的,它有性能开销。
  3. Java中的数组大小不变。它无法在以后调整大小。如果要调整大小,则必须将所有内容复制到新数组中。
  4. 没有指针算术,因此您无法将指针传递到数组中途的某个位置。这不是一个真正的问题:你传递整个数组,加上一个值告诉方法从哪里开始处理。但它有时会使Java方法看起来与它们的C语言略有不同。
  5. 数组总是在Java中初始化:每个元素都设置为0或false或null(取决于类型)。这是因为否则在写入之前从中读取时会出现未定义的行为,Java会尽其所能避免未定义的行为。这里也存在性能开销。
  6. 所有这一切都说明,有两件事情可以使这一切问题比你想象的要少。首先,对于迭代数组中所有元素的典型情况,您不会遇到太多问题。绑定非常简单,甚至可以通过JIT编译器进行优化,JIT编译器非常适合优化紧密循环。另一方面,到目前为止,对阵列进行大量处理的最重要问题是渐近复杂度,它不受上述任何影响。因此,尽管Java总体上较慢,但您仍然会发现C中的冒泡排序远比Java中的mergesort慢很多。

    需要注意的另一个关键事项是,很多内容可以帮助您并确保安全编码。当然,用Java编写垃圾是可能的,但是用C语言编写垃圾会更容易:超出数组的末尾,没有人会阻止你进入垃圾场。