-1

我正在将 C++ 程序转换为 Java,并且遇到了障碍,因为 java 中没有 memcpy。

在做了一些研究之后,我已经尽力而为,但我真的很犹豫,不确定这是否像 C++ 程序应该做的那样,因为我发现到目前为止我发现的信息有点令人困惑。

(Java 代码中仍有 memcpy,但已注释掉以供参考)

图像
= 输入图像
输出 = 输出图像
N = 图像宽度
M = 图像高度。

在 C++ 代码中,元素是无符号短整型。

C++ 代码

void medianfilter(element* image, element* result, int N, int M)
{
    //   Check arguments
    if (!image || N < 1 || M < 1)
        return;
    //   Allocate memory for signal extension
    element* extension = new element[(N + 2) * (M + 2)];
    //   Check memory allocation
    if (!extension)
        return;


    //   Create image extension
    for (int i = 0; i < M; ++i)
    {
        memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element));
        extension[(N + 2) * (i + 1)] = image[N * i];
        extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1];
    }
    //   Fill first line of image extension
    memcpy(extension, extension + N + 2, (N + 2) * sizeof(element));
    //   Fill last line of image extension
    memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element));
    //   Call median filter implementation
    _medianfilter(extension, result ? result : image, N + 2, M + 2);
    //   Free memory
    delete[] extension;
}

到目前为止的 Java 代码。

public static void medianfilter(long[] image, long[] result, int N, int M)
{
    //   Check arguments
    if (N < 1 || M < 1)
        return;
    //   Allocate memory for signal extension
    long[] extension = new long[(N + 2) * (M + 2)];

    //   Create image extension
    for (int i = 0; i < M; ++i)
    {
        //memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element));
        for( int k = 0 ; k < N ; k++)
        {
            extension[(N+2 * (i+1)+1)+k] = image[(N*i)+k];
        }

        extension[(N + 2) * (i + 1)] = image[N * i];
        extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1];
    }
    //   Fill first line of image extension
    //memcpy(extension, extension + N + 2, (N + 2) * sizeof(element));
    //   Fill last line of image extension
    //memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element));
    //   Call median filter implementation
    //_medianfilter(extension, result ? result : image, N + 2, M + 2);
}

我高度怀疑我做错了,只是想得到一些帮助。(程序的其余部分很简单,因为它不使用 memcpy)。

4

2 回答 2

3

实际上,Java 有一种memcpy, 调用的形式Arrays.copyOf

memcpy(source, dest, size)

变成

long[] dest = Arrays.copyOf(source, newSize);
于 2013-10-06T22:24:44.453 回答
0

Java 实际上确实有类似 memcpy() 的东西。Unsafe 类有一个与 memcpy() 基本相同的 copyMemory() 方法。当然,和 memcpy() 一样,它不提供内存覆盖、数据破坏等保护。不清楚它是否真的是 memcpy() 或 memmove()。它可用于从实际地址复制到实际地址或从引用复制到引用。请注意,如果使用引用,则必须提供偏移量(否则 JVM 将尽快死亡)。

Unsafe.copyMemory() 工作(在我旧的疲惫的 PC 上每秒高达 2 GB)。使用风险自负。请注意,并非所有 JVM 实现都存在 Unsafe 类。

您还应该看看“Java 中直接内存访问的技巧”(http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/)和“Java Magic. Part 4:sun.misc.Unsafe"(C++ 中的 memcpy 函数与 Java 等效)以获得一些额外的想法。这些人非常精通如何在 Java 中进行低级(和有风险)操作。

于 2013-10-30T16:50:09.967 回答