사용자 도구

사이트 도구


kb:memoryalignment

Memory Alignment

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

링크

kb/memoryalignment.txt · 마지막으로 수정됨: 2014/11/08 14:38 (바깥 편집)