쿠캬캬는 일관되게 unaligned memory를 사용하지 말라고 하는데, 이게 성능은 둘째치고 버스 오류로 죽을 수도 있기 때문이다.
전적으로 쿠캬캬 말이 맞는거다.
사실 x86에서 죽지 않는다는 것도 alignment checking 이 비활성화 되어있기 때문이라고 한다.
아래는 내가 보는 책에 있는 예제인데, 이 예제의 #if defined 부분이 바로 x86이나 x86에서 alignment checking 켜는 어셈이다.
이렇게 어셈으로 플래그 켜고 컴파일해서 실행하면 바로 버스 오류 뜬다.
x86이 아닌 대부분의 시퓨는 이게 기본값으로 켜져있다고 하더라.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
char *p_buf;
#if defined(__GNUC__)
# if defined(__i386__)
/* Enable Alignment Checking on x86 */
__asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__)
/* Enable Alignment Checking on x86_64 */
__asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif
if ((p_buf = (char *)malloc(sizeof(char) * 65536)) == NULL) {
return EXIT_FAILURE;
}
memcpy(p_buf, "1234567890abc", 13);
p_buf += 13;
*((int *)p_buf) = 123456;
return EXIT_SUCCESS;
}
'기승전붙을까'로 유명하신 그 분은 결국 자기 코드는 가져오지도 않으시고 이 글도 안읽으실 듯? 무슨 자신감으로 평소에 '니가 나보다 잘해?'를 외쳤던 건지가 궁금
동감. 결과만 올려놓으면 조작하는지 아닌지 혹은 코드를 잘못짰는지 알 수가 없는데, 정말 자신이 있으면 코드부터 까야지요