答案 0 :(得分:90)
答案 1 :(得分:81)
答案 2 :(得分:7)
答案 3 :(得分:5)
答案 4 :(得分:3)
Java确实有类似memcpy()的东西。 Unsafe类有一个copyMemory()方法,它与memcpy()基本相同。当然,就像memcpy()一样,它不提供内存覆盖,数据破坏等保护。目前尚不清楚它是真的是memcpy()还是memmove()。它可用于从实际地址复制到实际地址或从引用复制到引用。请注意,如果使用了引用,则必须提供偏移量(或者JVM将尽快消亡)。
Unsafe.copyMemory()可以工作(在我旧的PC上每秒高达2 GB)。使用风险由您自己承担。请注意,并非所有JVM实现都存在Unsafe类。
答案 5 :(得分:2)
答案 6 :(得分:2)
在使用JDK 1.5+时,应使用
System.arraycopy()
代替
Arrays.copyOfRange()
因为直到JDK 1.6才添加Arrays.copyOfRange(),所以您可能会得到
Java - “Cannot Find Symbol” error
在该版本的JDK中调用Arrays.copyOfRange时。
答案 7 :(得分:1)
否。 Java没有等效于memcpy
。 Java等效于memmove
。
如果src和dest参数引用相同的数组对象,则执行复制,就好像首先将srcPos到srcPos + length-1位置上的分量复制到具有length分量的临时数组中,然后将临时数组通过目标数组的destPos + length-1复制到了位置destPos。
如果System.arraycopy
和memcpy
引用相同的数组,很有可能src
的性能永远不会与dest
相同。通常,这会足够快。
答案 8 :(得分:0)
使用byteBufferViewVarHandle或byteArrayViewVarHandle。
这将使您直接将“ longs”数组复制到“ doubles”数组,并且类似以下内容:
public long[] toLongs(byte[] buf) {
int end = buf.length >> 3;
long[] newArray = new long[end];
for (int ii = 0; ii < end; ++ii) {
newArray[ii] = (long)AS_LONGS_VH.get(buf, ALIGN_OFFSET + ii << 3);
}
}
private static final ALIGN_OFFSET = ByteBuffer.wrap(new byte[0]).alignmentOffset(8);
private static final VarHandle AS_LONGS_VH = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.nativeOrder());
这将使您像以下那样进行黑客攻击:
float thefloat = 0.4;
int floatBits;
_Static_assert(sizeof theFloat == sizeof floatBits, "this bit twiddling hack requires floats to be equal in size to ints");
memcpy(&floatBits, &thefloat, sizeof floatBits);