Nice programing

Java에서 memcpy ()에 해당하는 것이 있습니까?

nicepro 2020. 10. 20. 08:09
반응형

Java에서 memcpy ()에 해당하는 것이 있습니까?


byte []가 있고 다른 byte []에 복사하고 싶습니다. 아마도 여기에 간단한 'C'배경을 표시하고 있지만 Java의 바이트 배열에 memcpy ()와 동등한 것이 있습니까?


같은 클래스 System.arraycopy에서 배열 함수를 시도 하거나 사용할 수 있습니다 . 둘 다 내부적으로 기본 성능을 제공해야합니다.Arraysjava.util.Arrays.copyOf

Arrays.copyOf는 가독성에 유리할 수 있지만 Java 1.6에서만 도입되었습니다.

 byte[] src = {1, 2, 3, 4};
 byte[] dst = Arrays.copyOf(src, src.length);
 System.out.println(Arrays.toString(dst));

사용 System.arraycopy에 ()

System.arraycopy(sourceArray, 
                 sourceStartIndex,
                 targetArray,
                 targetStartIndex,
                 length);

예,

String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);


또는 Arrays.copyOf ()
예제를 사용하십시오.

target = Arrays.copyOf(source, length);

java.util.Arrays.copyOf(byte[] source, int length)JDK 1.6에서 추가되었습니다.

copyOf()방법은 System.arrayCopy()배열의 복사본을 만드는 데 사용 되지만 배열 clone()의 일부를 복사 할 수 있기 때문에 보다 유연 합니다.


1 차원 배열의 정확한 복사본을 원하면 clone().

byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();

다른 어레이 복사 작업의 경우 Tom이 제안한 대로 System.arrayCopy/ Arrays.copyOf사용 합니다 .

일반적으로 clone피해야하지만 이것은 규칙의 예외입니다.


System.arrayCopy 를 사용할 수 있습니다 . 소스 배열의 요소를 대상 배열로 복사합니다. Sun 구현은 수작업으로 최적화 된 어셈블러를 사용하므로 빠릅니다.


Java에는 실제로 memcpy ()와 같은 것이 있습니다. Unsafe 클래스에는 memcpy ()와 본질적으로 동일한 copyMemory () 메서드가 있습니다. 물론 memcpy ()와 마찬가지로 메모리 오버레이, 데이터 파괴 등으로부터 보호를 제공하지 않습니다. 실제로 memcpy ()인지 memmove ()인지는 명확하지 않습니다. 실제 주소에서 실제 주소로 또는 참조에서 참조로 복사하는 데 사용할 수 있습니다. 참조가 사용되는 경우 오프셋을 제공해야합니다 (그렇지 않으면 JVM이 최대한 빨리 종료됩니다).

Unsafe.copyMemory ()는 작동합니다 (오래된 지친 PC에서 초당 최대 2GB). 자신의 책임하에 사용하십시오. 모든 JVM 구현에 대해 Unsafe 클래스가 존재하는 것은 아닙니다.


System.arraycopy 를 사용할 수 있습니다.


아니요. Java에는 memcpy. Java는 memmove대신에 동등합니다 .

src 및 dest 인수가 동일한 배열 객체를 참조하면 srcPos ~ srcPos + length-1 위치의 구성 요소가 먼저 길이 구성 요소가있는 임시 배열에 복사 된 다음 임시 배열의 내용이 복사 된 것처럼 복사가 수행됩니다. 대상 배열의 destPos + length-1을 통해 위치 destPos에 복사됩니다.

오라클 문서

그것은 매우 가능성이 System.arraycopy동일한 성능이 결코 memcpy경우를 srcdest같은 배열을 참조하십시오. 일반적으로 이것은 충분히 빠릅니다.


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);

참고URL : https://stackoverflow.com/questions/3329163/is-there-an-equivalent-to-memcpy-in-java

반응형