쿠캬캬는 일관되게 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;

}