여기 내 코드입니다 :ARM은 정렬되지 않은 예외를 생성하지 않습니다
char data[5] = {0x1, 0x2, 0x3, 0x4, 0x5 };
int *ptr = (int *)(data + 1);
int value = *ptr;
printf("address of data= %lu\n",data);
printf("address of data +1 = %lu\n",data+1);
내가 사용 컴파일 할 GCC -Wcast-정렬이 경고 "대상 유형의 정렬을 필요 캐스트 증가"방출, ARM을 위해.
그러나 ARM 프로세서에서 실행할 때 은 정렬되지 않은 액세스 예외을 생성하지 않습니다.
printf는 데이터가 4의 배수 인 주소에 위치하므로 데이터 + 1은 정렬되지 않은 예외를 생성해야하는 홀수 주소임을 나타냅니다.
/proc/cpu/alignment를 3으로 설정했습니다. dmesg에서 메시지를받지 못했습니다.
예외가 발생하지 않는 이유는 무엇입니까?
데이터 배열이 4의 배수 인 주소에 정렬되도록하려면 어떻게해야합니까? 디버깅 중에 검사 할 때 데이터 배열의 실제 주소는 무엇입니까? 어떤 ARM CPU입니까? – Malkocoglu
팔 버전 7입니다. 질문을 편집하여 데이터 주소를 인쇄 해 보겠습니다. – linuxfreak
팔 (밉스 등)은 역사적으로 정렬되지 않은 전송에 대해 낙담하고 잘못했기 때문에 항상 볼 수 있다는 의미는 아니며 이벤트를 사용 중지 할 수 있으며 코어에 따라 정렬되지 않은 전송에서 반환 된 데이터는 결정적입니다 (최신 코어는 프로그래머가 기대하는 것처럼). 성능상의 불이익은 자연스럽게 x86과 같습니다. –