코드 아래에 반영되는 형태로 닷넷 프레임 워크 : 제 생각에는Marshal.WriteInt64 메서드의 코드가 너무 복잡한 이유는 무엇입니까?
[SecurityCritical]
public static unsafe void WriteInt64(IntPtr ptr, int ofs, long val){
try{
byte* numPtr = (byte*) (((void*) ptr) + ofs);
if ((((int) numPtr) & 7) == 0){
*((long*) numPtr) = val;
}
else{
byte* numPtr2 = (byte*) &val;
numPtr[0] = numPtr2[0];
numPtr[1] = numPtr2[1];
numPtr[2] = numPtr2[2];
numPtr[3] = numPtr2[3];
numPtr[4] = numPtr2[4];
numPtr[6] = numPtr2[6];
numPtr[7] = numPtr2[7];
}
}
catch (NullReferenceException){
throw new AccessViolationException();
}
}
, *((long*) numPtr) = val
충분히, 그리고 매우 효율적입니다.
왜 그렇게 복잡합니까?
어쩌면 뭔가 endiens 함께 할 수있는 (이것은 '루프 언 롤링'라고합니다) 시간을 절약 할 수있는 루프를 건너 뛰고, 한 번에 한 바이트를 쓴다? . – KingCronus
나에게 메모리 정렬과 관련이있는 것처럼 보입니다. –
그건 memcpy()이고 손으로 풀어 놓았습니다. ARM 코어에서 필요하다고 생각합니다. –