【问题标题】:memcpy function in C++ to Java equivalentC++ 中的 memcpy 函数与 Java 等效
【发布时间】:2011-08-28 22:40:39
【问题描述】:

我有 C++

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

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

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

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

希望我的问题很清楚。

谢谢

【问题讨论】:

  • 这可以在c++中通过指针完成,但在java中如何处理?
  • This 可能会对您有所帮助。
  • 复制对象的内存不是创建另一个对象实例。
  • 我的意思是说一个临时的控股结构。
  • 作为替代方案,您可以使用JNIJNA 方法在C/C++ 代码和Java 之间进行接口

标签: java c++


【解决方案1】:

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

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

您还应该查看“Tricks with Direct Memory Access in Java”(http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/) 和“Java Magic. Part 4: sun.misc.Unsafe”(memcpy function in C++ to Java equivalent) 以获得更多想法。这些人非常精通如何在 Java 中进行低级别(且有风险)的操作。

【讨论】:

    【解决方案2】:

    在 Java 中你没有指针。如果您有一个要复制的对象实例obj,那么您必须自己进行。尽管在其他答案中建议clone() 作为一种可能性,但我会避免它。您可以做的一件事是使用复制构造函数(C++ 中也有)。您可能想阅读this,了解为什么不推荐使用clone()

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这个类包含所有字节[]数组。那么你认为arraycopy会有帮助吗?
      • @JavaBits 类包含什么并不重要。重要的是它的界面;如果类是不可变的,那么浅拷贝是有意义的。否则也可能有意义,但是您必须考虑到副本很浅。例如,System.arraycopy(pr_masks, 0, wkpm, 0, pr_masks.length) 应该可以工作,前提是 wkpm 足够大并且类型正确。
      【解决方案4】:

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

      【讨论】:

      • -1 推荐了clone(),这对avoid 来说通常是个好主意!
      • @MarcoS,虽然避免 clone() 可能会很好,但我认为这里没有任何问题。 OP 的要求没有隐含的功能是问题,并且没有比 memcpy 更多的问题。顺便说一句:我根本不使用 clone() 。我生成我的数据结构以具有复制方法/构造函数。
      • @Peter Lawrey:也许你是对的,但我仍然不建议使用我不信任的方法。在这种情况下,由于 OP 熟悉 C++,我会推荐一个复制构造函数,就像我在 answer 中所做的那样:)
      • 您愿意详细说明您对 clone() 的问题吗?看原提问者的措辞,我觉得他在编程方面不是很有经验。我怀疑:不要使用 clone() 对他有多大帮助(我从来没有遇到过 clone() 的问题,所以不知道你指的是什么)。
      • @Angel O'Sphere:阅读Josh Bloch book "Effective Java" 后,我决定避免使用克隆。一些提示也是here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 2011-03-20
      • 2011-04-07
      • 2011-11-02
      相关资源
      最近更新 更多