MemoryAlignment란 아래와 같은 구조체의 크기가 11 바이트가 아니라, 컴파일러의 패딩에 의해 12 또는 16바이트가 되는 현상을 두고 하는 말이다.
struct EMP { int ID; // 4 바이트 char state[3]; // 3 바이트 int salary; // 4 바이트 }; sizeof(EMP) = ???
파일/소켓 등에서 입출력을 수행할 때 주로 문제가 된다. MemoryAlignment란 것이 있는 줄도 모르던 시절에 TGA 이미지 헤더를 읽어들이는데, 고생했던 기억이 새록새록… ㅠㅠ
Visual C++에서는 #pragma pack 구문을 이용하여 간단히 해결할 수 있다. 파일/소켓 등에 기록하는 구조체는 정렬을 1바이트로 줘야할 것이다. 다른 컴파일러에도 비슷한 구문이 있을 듯 하다.
// pragma_directives_pack.cpp // compile with: /W1 /LD #pragma pack() // n defaults to 8; equivalent to /Zp8 #pragma pack(show) // C4810 #pragma pack(4) // n=4 #pragma pack(show) // C4810 #pragma pack(push, r1, 16) // n=16, pushed to stack #pragma pack(show) // C4810 #pragma pack(pop, r1, 2) // n=2 , stack popped #pragma pack(show) // C4810