memcpy函数在C ++中与Java等价

时间:2011-05-19 14:23:14

标签: java c++

我有C ++

memcpy (&wkpm, (PMSK *)pr_masks + (long)(x - 1), sizeof(PMSK)); 

其中PMSK是一个结构。它将是Java中的一个类。

现在假设我在这里将整个内存块复制到pr_masks中,即创建PMSK类的附加实例。 如何在Java中执行此操作。

示例:在第20行的java代码中,我希望捕获类实例,然后再次使用第100行中的相同实例。在两者之间可能有许多修改。

希望我对我的问题很清楚。

谢谢

4 个答案:

答案 0 :(得分:6)

在Java中,您需要对对象执行浅clone()或单独复制每个字段。没有低级别,使一个对象成为另一个对象的副本。

答案 1 :(得分:2)

Java确实有类似memcpy()的东西。 Unsafe类有一个copyMemory()方法,它与memcpy()基本相同。当然,就像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。第4部分:sun.misc.Unsafe”(memcpy function in C++ to Java equivalent)想法。这些人非常精通如何在Java中进行低级(和冒险)操作。

答案 2 :(得分:0)

java.lang.System.arraycopy,但这是一个浅层副本。如果PMSK是一个类,那么该数组将只包含指针,并且只会复制指针。如果您需要深层复制,则必须创建课程Cloneable,并编写自己的循环,每次克隆。

我不知道PMSK是什么,所以很难说,但一般来说,值类型对象的最佳策略是使它们不可变,派生新对象而不是改变它们。 (java.awt.Color可能就是一个例子。)如果你这样做,无论你使用深拷贝还是浅拷贝都没关系,java.lang.System.arraycopy应该完成这项任务。

答案 3 :(得分:0)

在Java中你没有指针。如果您要复制的对象实例obj,则必须自己执行。虽然在其他答案中建议clone()作为一种可能性,但我会避免这种情况。你可以做的一件事是使用复制构造函数(你在C ++中也有)。您可能需要阅读this,了解为何不推荐clone()