구조체와 메모리 관계

필자는 그동안 패턴/객체지향 등의 화려한 기술등의 매료되어 많은 시간을 보내 왔는데 최근 취업때문에 기술 시험을보게 되었는데 가장 기초적인 클래스의 사이즈에 대해 문제가 나왔는데 그 동안 알고 있다고 대충 넘어 갔던 부분에서 문제를 틀리게 적었다. 이 때문에 기초 지식의 강화의 필요성을 느끼고 우선 클래스의 모체가 되는 구조체와 메모리 상의 관계를 공부하고 정리하고자 해당 글을 올리게 되었다.

  현재 대중적인 운영체제인 Windows XP는 32bit 체계이다. 물론 64bit버전도 있지만 대부분 32bit버전을 많이 사용한다. 그 이유는 호환성에서 문제가 생기기 때문인데 그 이유가 무엇일까? 
대부분의 16bit 와 32bit processor들은 word(2byte) 와 long word(4byte)가 아무 offset에 저장되는 것을 허용하지 않는다. 홀수인 메모리주소에 16bit 자료를 쓰기하는 것은 예외를 일으킨다.

간단한 예를 들어보자. 
12바이트 데이터가 있다고 치자 32비트 체계에서는 다음과 같이 4바이트로 나누어 데이터 처리를 한다.

  64비트 데이터는 8바이트로 나누어 처리하는데 데이터가 8바이트 보다 작을 경우 빈공간을 채우는데 12바이트 데이터일 경우 16바이트의 메모리를 사용하게 되는 것이다.

01 typedef struct tagDATA
02 {
03     int     nID;
04     char    Name;
05     char*   pTarget;
06       
07 }DATA;
08   
09 int _tmain(int argc, _TCHAR* argv[])
10 {
11     printf("size : %d\n"sizeof(DATA));
12   
13     return 0;
14 }



위 코드는 몇 바이트일까? int(4바이트) + char(1바이트) + char*(4바이트) = 9바이트 일까? 



답은 No이다.
그 이유는 무엇일까? Structure Alignment때문이다.


Structure Alignment

- 자료형 중 가장 큰 데이터 타입을 기준으로 정렬하게 된다.
- 운영체제의 체계에 따라 데이터를 버스 크기만큼 정렬하는 역할을 한다.
- Structure Alignment는 CPU 의존적이다.
- 32bit 시스템일 경우 32bit보다 작을 경우 쉬프트 연산으로 인한 오버헤드가 크다. 차라리 몇 바이트 낭비하는 대신 성능상의 이점을 얻을 수 있다.



구조체 정렬에 의해 위 코드는 4바이트 + 4바이트 + 4바이트 총 12바이트를 가진다.
■■■■  ■□□□  ■■■■

char형은 1바이트이지만 4바이트 체계에 맞추기 위해 3바이트의 Empty Block이 생긴다. 

그렇다면 구조체 맴버 중 4바이트를 넘어 8바이트를 차지할 경우 어떻게 될까? 소스를 살펴 보자.

01 typedef struct tagDATA
02 {
03     double  nID;
04     char    Name;
05     char*   pTarget;
06       
07 }DATA;
08   
09 int _tmain(int argc, _TCHAR* argv[])
10 {
11     printf("size : %d\n"sizeof(DATA));
12   
13     return 0;
14 }
15   
16 <SPAN id=tx_marker_caret></SPAN>



 


가장 큰 데이터형인 double(8바이트)에 맞추게 되어 16바이트가 된다.
■■■■■■■■ ■□□□■■■■  

그렇다면 저러게 낭비되는 공간 없이 데이터를 정렬 할려면 어떻게 해야할까? Visual Studio 2008를 기준으로 프로젝트 속성 메뉴에 보면 다음과 같은 메뉴를 볼 수 있다.


Struct Member Alignment 옵션에 Default로 잡혀 있는데. 이는 4바이트 정렬을 사용한다. 1Byte로 정렬을 바꾸게 되면 메모리 낭비 없이 데이터를 정렬할 수 있다.

이렇게 되면 위 2개의 코드의 실행 결과가 각각 9바이트 / 13바이트인 것을 를 얻을 수 있다.


 


이 내용을 정리하면서 절로 허탈한 웃음이 나왔다. 가장 기초적이서 소홀하게 공부했고 다시 글을 정리하게 되었으니 말이다

 

출처 : http://studycan.tistory.com/89




비쥬얼은 구조체사이즈를 기본으로 4바이트를 잡아서 크기가 설정된다.

내가 궁금한 부분을 아주 잘 설명해주셧다.

오호 난 아직도 기본이 부족하구나~

기본을 탄탄히!!!

이 글을 공유하기

댓글

Designed by JB FACTORY