구조체와 공용체의 차이

Nash·2022년 2월 21일
0

C

  • Struct(구조체) 와 Union(공용체)의 차이는 무엇인가?
  1. Struct에 변수가 있을때, 컴파일러는 각 멤버에게 메모리를 할당한다.
    Struct의 size는 각 멤버의 size의 합보다 같거나 그 이상이다.
    가장 작은 멤버(size)는 Slack bytes로 끝날 수 있다.

    Slack bytes
    최적화된 컴파일러는 데이터에 빠르게 접근할 수 있도록하기 위해서 항상 짝수 주소를 구조체의 맴버에게 할당한다. 짝수 주소는 2,4,8,16의 배수일 수 있다. 이것은 일부 멤버의 사이에 사용되지 않는 bytes나 구멍을 발생시킨다. 이러한 사용되지 않은 byte 또는 구조체의 멤버 사이의 구멍을 Slack bytes 라 한다.
    P.S Padding byte랑 Slack byte랑은 다른 개념인가? 똑같아보이는데..

    struct EMPLOYEE
    {
     	char name[8]; // 8byte
     	int id; // 4byte (slack byte : 4byte)
     	double salary; //8byte
    };
    
    sizeof(EMPLOYEE) : 24

  • Union(공용체)의 경우, Union에 변수가 있다면 컴파일러는 가장 큰 메모리의 크기를 고려하여 메모리를 할당한다. 그래서 Union의 size는 가장 큰 멤버의 size와 동일하다.

    union EMPLOYEE {
        char name[8];
        int id;
        double salary; //8byte인 double형을 기준으로 size를 잡는다.
    };
    
    sizeof(EMPLOYEE) : 8

  1. Struct(구조체)안에 있는 각 멤버는 고유의 위치 저장 영역이 할당된다.
    반면, 메모리가 할당된 Union(공용체)의 경우 모든 멤버가 공간을 공유한다.

  1. Struct에서 각 멤버의 주소는 오름차순 정렬된다. 이는 각 맴버의 메모리가 다른 오프셋(offset) 값으로 시작한다는 것을 의미한다. 반면 Union에서 주소는 Union의 모든 맴버의 주소와 같다. 이는 모든 멤버가 같은 Offset(오프셋)값으로 시작한다는 것을 의미한다.

  1. Struct에서 맴버의 Value값을 변경하는 것은 Struct안의 다른 멤버에게 영향을 미치지 않는다. 반면, Union에서 맴버의 Value값을 변경하는 것은 Union내 모든 맴버 value값을 변경시킬 것이다.

  1. Struct에서 개개인의 멤버를 한번에 접근시킬 수 있고, Union에서는 한 번에 하나의 멤버만 접근시킬 수 있다.

  1. 구조체의 몇몇 맴버들은 한번에 초기화(initialize)할 수 있는 반면, Union에는 첫 번째 멤버만 초기화할 수 있다.

profile
나에게 중요한 건, 동기부여와 의지

0개의 댓글