繁体   English   中英

直接访问阵列的一部分

[英]Direct access to part of an array

为了加快我的图像处理应用程序,我正在尝试从中间开始处理数组中的值,并使用从0开始的索引。

例如,当我使用两个数组时,我经常遇到这样的情况:

public void work(int[] array1, int[] array2, int offset)
{
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array2[i + offset];
}

所以我想创建一个新的变量array3,它直接映射到array2的中间(不是副本),所以我可以这样做:

public void work(int[] array1, int[] array2, int offset)
{
    int[] array3 = array2[offset]...;
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array3[i];
}

实际上,我想要一个与此c语句等效的Java:

int *array3ptr = array2ptr + offset;

注意:我没有任何JNI或任何经验,所以如果归结为使用它,请提供工作示例。

使用纯Java数组和array[index]表示法不可能做到这一点。 在Java中,数组永远不会重叠

但是,您可以将数组包装在IntBuffer 如果使用直接缓冲区 (请参阅allocateDirect ),您应该获得真正的良好性能。

声明如

int *array3ptr = array2ptr + offset;

将写成

IntBuffer array3 = array2.slice().position(offset);

这些

在java中,整数数组是堆上的对象。 因此int [] array2实际上是直接引用内存中的整数数组。 没有创建对象(即数组)的副本,复制只是对数组的引用。

我对它们没有多少经验,但我认为你可以通过将数组(和子数组)包装到IntBuffer实例中来做到这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM