C++프로그래밍

2013.04.15_구조체_메모리관리

성엽이 2013. 4. 15. 16:50

▶구조체 :

 C언어에서는 구조체와 배열을 중첩적으로 정의하므로 복잡한 구조의 자료를 효율적으로 구성할수 있다.


 

#include < stdio.h >

#pragma pack(1)  // 1byte 기반으로 byte 를 Packing 한다.

struct SMART  // 구조체이름을 SMART 라고 하고 
{    // 1 byte를 기반으로 byte를 Packing 한다.
  int A;  // 4 byte
  char B;  // 8 byte
  int C;  // 12 byte
  short D;  // 16 byte
  char E;  // 16 byte
  int F;  // 20 byte
  char G;  // 24 byte
  short H;  // 24 byte
  char I;  // 28 byte
};

#pragma pack(4)  // 4byte 기반으로 byte 를 Packing 한다. 
 
struct SMART1  // 구조체이름을 SMART1 라고 하고 
{    // 4 byte를 기반으로 byte를 Packing 한다.
  int A;  // 4 byte
  char B;  // 5 byte
  int C;  // 9 byte
  short D;  // 11 byte
  char E;  // 12 byte
  int F;  // 16 byte
  char G;  // 17 byte
  short H;  // 19 byte
  char I;  // 20 byte
};

int main()
{
  printf("%d\n"sizeof(struct SMART));  
  printf("%d\n"sizeof(struct SMART1));  
  return 0;
}



 ※ 컴파일러에 따라 #pragma pack(push, 1) // push 를 바로 저장하고 1byte 만큼 최적화하는것 

                         #pragma pack(pop) 을 사용할때도 있다. push 와 pop 같은 경우는 컴파일러에 따라 잘 골라써야한다.

 메모리 관리 측면에서 전처리 #pragma 개념은 아주 중요하다 ! (하지만 속도는 줄어든다 ㅠ)



▶ 결과는 놀랍게도 20 byte28 byte 가 나온다!



#include < stdio.h >

struct _SMART
{    
  int A;

  
};

typedef struct _SMART SMART;  // 우리가 정의해준 자료형의 이름을
                                // SMART 라고 하자.

// 위에 구조를 합쳐서 적어준 형태가 아래 형태이다.
// 태그도 생략이 가능하긴하다! 아래에서 _SMART1 을 태그라고함.


typedef struct _SMART1  // 우리가 정의해준 자료형의 이름을
{                         // SMART1 이라고 하자.
  int A;    
  
  
}SMART1;




int main()
{
  SMART test;
  SMART1 test1;
  
  test.A = 100;
  test1.A = 200;

      
  printf("%d\n", test.A);
  printf("%d\n", test1.A);

  return 0;
}
 



▶ 줄여도 잘된다 !


----------

9_2.c


test3.c


test4.c

--------