我主要是一名C ++程序员,但我正在考虑将Java用于项目。出于性能原因,我需要使用一些SSE内在函数(即使相对于普通的C ++,这些也可以大大提高速度)。
据我了解,在Java中执行此操作的方法是使用JNI并在C中调用SSE内在函数。但是,我在JNI文档中读到的内容让我感到不安,因为它说JVM可能会或者可能会不要创建发送到C并返回的数组的副本。
假设有一个最先进的实现,比如OpenJDK 7,当我请求指向byte [],short [],int []或float []的时候我应该什么时候才能实现复制?
到目前为止,我发现的只是一些矛盾的说法。要被接受,答案必须说服我:例如提供证据或引用来源,而不仅仅表达意见/猜测。
修改
答案 0 :(得分:4)
我会考虑使用带有本机字节排序的直接ByteBuffer。这样做的好处是它以一种方式使用C空间内存,这意味着你不需要复制它来用Java访问它(反之亦然)
答案 1 :(得分:1)
到目前为止,我发现的只是一些相互矛盾的说法
不,这些并不是相互矛盾的,因为所说的是您所要求的是 实施细节 ,并取决于您将使用的JDK实现。登记/>
你不应该期望所有实现都有相同的行为,你应该考虑哪一个做你想要的
为了给您一个实现差异的示例,SUN
JDK将char[]
传递给C
代码null终止,而IBM则没有。
所以你应该深入研究实现和测试。至于你的问题,我不确定为什么阵列副本不会发生,因为我认为内存区域完全有变化