반응형
아래 포스트한 내용처럼 pack 을 사용하기도 하지만 멤버변수 선언 순서를 잘 맞춰 선언하는 것이 효율적이다







http://pdw1208.tistory.com/entry/pragma-pack


#include <stdio.h>

struct test{
  int iNum;
  char A;
  short B;
  char C;
};

void main()
{
  struct test B;
  
  B.iNum = 1000;
  printf("구조체의 크기는 %d\n"sizeof(B));
  
}















구조체의 크기가 12라고 출력이 되었다  좀 이상하다 


int  +  char + short + char 는 즉
 4   +    1    +   2    +   1  =  8 이 나와야 정상이다 

32비트 CPU는 4바이트 최적화를 한다 다음으로는 2바이트 최적화를 한다

따라서 그림과 같이 메모리에 들어가지 않고  




아래 그림과 같이 들어간다 A다음에 3바이트가 남아서 이럴경우는 다시 2바이트 최적화를 한다 

4바이트 메모리구조에서 메모리상에서 2바이트 최적화의 경우는 앞에 2바이트 뒤에 2바이트로 최적화를 하지

위 그림에서 B와 같이 중간에 2바이트를 할당하지 않는다 아래 그림과 같이 뒤에 2바이트를 할당한다 

남은 C 즉 1바이트는 B 다음에 할당한다 그래서 구조체의 크기는 12가 나오는 것이다     

A와 B 사이의 1바이트는 죽은 공간으로 사용은 하지 않지만 메모리만 잡아먹는 죽은 공간이다 




이를 해결하는 방법이 #pragma pack 을 이용해 메모리를 1바이트 최적화를 해주는 것이다 

#include
 <stdio.h>

#pragma pack(push, 1)  // (1) 이렇게도 사용가능 
struct test{
  int iNum;
  char A;
  short B;
  char C;
};
#pragma pack(pop)  // (4)  이렇게도 사용가능 

void main()
{
  int A = 100;
  struct test B;

  B.iNum = 1000;

  printf("구조체의 크기는 %d\n"sizeof(B));
}
 



구조체 전에 

#pragma pack(push, 1) 이나 (1) 을 선언해 메모리를 1바이트 최적화를 시킨다 그렇게되

면 구조체의 크기는 선언된 변수의 자료형의 크기만큼의 구조체를 가진다 

구조체선언 다음에  #pragma pack(pop) 이나 (4) 선언해 다시 4바이트 최적화를 해준다  

32비트 CPU에서는 4바이트(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르게 때문이다  즉 

#pragma pack(1) 또는 (push ,1) 이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생

길 수 있다


각변수는 메모리상에서 그림과 같이 공간을 차지한다   
 

반응형

+ Recent posts