나는 메모리 블록 복사 루틴을 만들고 있으며 효율적인 청크에서 원시 메모리 블록을 처리해야합니다. 내 질문은 * 내가 만들고있어 전문 복사 루틴에 대한 것이 아니라 방법에 올바르게의가 이미 null 이외의 문자로 던져 말할 수 있도록, 내가 메모리의 원시 포인터를 원시 포인터 조작을위한 승인 된 구문
C.
에 원시 포인터 정렬을 검사 . 제 아키텍처에서는 64 바이트 청크로 메모리를 효율적으로 복사 할 수 있습니다. 따라서 (표준) 트릭은 헤드 및/또는 꼬리에서 0-63 바이트의 간단한 복사본을 만들어 임의의 길이의 임의의 char *에서 64 바이트의 정렬 된 포인터로 복사를 변환하는 것입니다. 길이가 64 바이트입니다.이제는 어떻게 합법적으로 포인터를 검사하여 정렬을 결정 (및 조작)합니까? 확실한 방법은 정수로 캐스팅 그냥 비트 검토하는 것입니다 : 여기
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
주 내가 alignedPointer 포인터와 같은 메모리를 가리 키지 않는다는 것을 깨닫게을 ...이 (가) "반올림"입니다 포인터를 복사하여 효율적인 복사 루틴을 호출 할 수 있으며 처음에는 수동으로 다른 바이트를 처리 할 것입니다.
그러나 컴파일러는 (정당하게) 정수로 포인터를 캐스팅 할 때 놀라지 않을 것입니다. 하지만 그 밖에 어떻게 포인터의 하위 비트를 검사하고 조작 할 수 있습니까? LEGAL C? 이상적으로 다른 컴파일러를 사용하면 오류나 경고가 발생하지 않습니다. 포인터를 저장하기에 충분히 큰 정수 유형의
'int'가 포인터 유형과 동일한 크기 인 한 확인해야합니다. –
http://stackoverflow.com/questions/1898153/how-to-determine-if-memory-is-aligned-testing-for-alignment-not-aligning/1898194 –
아, 포인터는 MSB에서 LSB로 바이너리로 저장된다는 것을 전제로합니다. 우리는 무엇을 가지고 있나? * 정의되지 않은 행동! * (치명적인 무기 녀석이 외교적 면책 특권을 말하는 것과 같은 방식으로! *) 실제 세계에서 효과가 있기 때문에 그것이 덜 정의되지는 않습니다. ;-) –