사용자 도구

사이트 도구


kb:memoryalignment

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:memoryalignment [2014/11/08 14:38] (현재)
줄 1: 줄 1:
 +====== Memory Alignment ======
 +[[MemoryAlignment]]란 아래와 같은 구조체의 크기가 11 바이트가 아니라, 컴파일러의 패딩에 의해 12 또는 16바이트가 되는 현상을 두고 하는 말이다.
 +
 +<code cpp>
 +struct EMP
 +{
 +  int  ID;        // 4 바이트
 +  char state[3]; ​ // 3 바이트
 +  int  salary; ​   // 4 바이트
 +};
 +
 +sizeof(EMP) = ???
 +</​code>​
 +
 +파일/​소켓 등에서 입출력을 수행할 때 주로 문제가 된다. [[MemoryAlignment]]란 것이 있는 줄도 모르던 시절에 TGA 이미지 헤더를 읽어들이는데,​ 고생했던 기억이 새록새록... ㅠㅠ
 +
 +[[VisualCpp|Visual C++]]에서는 <​nowiki>#​pragma pack</​nowiki>​ 구문을 이용하여 간단히 해결할 수 있다. 파일/​소켓 등에 기록하는 구조체는 정렬을 1바이트로 줘야할 것이다. 다른 컴파일러에도 비슷한 구문이 있을 듯 하다.
 +
 +<code cpp>
 +// 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
 +</​code>​
 +
 +====== 링크 ======
 +  * [[http://​weblogs.asp.net/​oldnewthing/​archive/​2004/​08/​26/​220873.aspx | Why do some structures end with an array of size 1?]]
 +  * [[http://​blogs.msdn.com/​oldnewthing/​archive/​2004/​08/​27/​221486.aspx | Importance of alignment even on x86 machines, part 1]]
 +  * [[http://​blogs.msdn.com/​oldnewthing/​archive/​2004/​08/​30/​222631.aspx | Importance of alignment even on x86 machines, part 2]]
 +  * [[http://​www-128.ibm.com/​developerworks/​library/​pa-dalign/​ | Data alignment: Straighten up and fly right]]
 +
  
kb/memoryalignment.txt · 마지막으로 수정됨: 2014/11/08 14:38 (바깥 편집)