簡體   English   中英

memcpy函數在C ++中與Java等價

[英]memcpy function in C++ to Java equivalent

我有C ++

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

其中PMSK是一個結構。 它將是Java中的一個類。

現在假設我在這里將整個內存塊復制到pr_masks中,即創建PMSK類的附加實例。 如何在Java中執行此操作。

示例:在第20行的java代碼中,我希望捕獲類實例,然后再次使用第100行中的相同實例。在兩者之間可能有許多修改。

希望我對我的問題很清楚。

謝謝

在Java中,您需要對對象執行淺clone()或單獨復制每個字段。 沒有低級別,使一個對象成為另一個對象的副本。

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 .Part 4:sun.misc.Unsafe“( 在C ++中的memcpy函數與Java等價 )的一些額外的想法。 這些人非常精通如何在Java中進行低級(和冒險)操作。

java.lang.System.arraycopy ,但這是一個淺拷貝。 如果PMSK是一個類,那么該數組將只包含指針,並且只會復制指針。 如果你需要深層復制,你必須使類Cloneable ,並編寫自己的循環,每次克隆。

我不知道PMSK是什么,所以很難說,但一般來說,值類型對象的最佳策略是使它們不可變,派生新對象而不是改變它們。 java.awt.Color可能就是這樣的一個例子。)如果你這樣做,無論你使用深拷貝還是淺拷貝都沒關系, java.lang.System.arraycopy應該可以完成這項工作。

在Java中,你沒有指針。 如果您有要復制的對象實例obj ,則必須自己執行。 雖然在其他答案中建議使用clone()作為一種可能性,但我會避免使用它。 你可以做的一件事是使用復制構造函數(你在C ++中也有)。 您可能希望閱讀此內容 ,了解不建議使用clone()原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM