[struct와 union의 메모리 구조 차이]

 

클래스 내부에 이름이 없는 struct를 선언하는 것은, 보통 이 키워드에 해당하는 메모리 구성으로 사용하라는 뜻이 된다.

class A
{
    struct 
    {
        int a;
        int b;
    };
};

 

위의 코드에서 int a와 int b는 struct 키워드에 해당하는 메모리 구성으로 이루어지게 된다. 따라서 다음과 같은 메모리 구조를 갖는다([] = 1byte).

 

a      b

[][][][][][][][]

 

여기서 struct를 union으로 변경해보자.

class A
{
    union
    {
        int a;
        int b;
    };
};

 

이렇게 되면 메모리 구조가 다음과 같이 변경된다.

 

a

b

[][][][]

 

 

[union 메모리 구조]

 

union 키워드 내부의 변수들은 메모리 영역을 공유하게 된다. union 내부에 동일한 형태의 자료형이 존재한다면, 가장 마지막에 호출되어 변경된 메모리 상태를 공유한다.

union Un
{
    int a;
    int b;
};

int main()
{
    UTest1 Un = Un();
    Un.a = 10;
    Un.b = 20;

    int A = Un.a;  // A = 20
    int B = Un.b;  // B = 20
}

 

union 내부에 자료형의 크기가 다를 경우에는 가장 메모리가 큰 변수를 기준으로 메모리 영역을 할당받은 뒤, 메모리 상태를 공유한다.

union
{
    int a;
    int b;
    __int64 c;
};

 

위의 union 내부 자료형들은 다음의 메모리 구조를 갖는다.

 

a

b

c

[][][][][][][][]

 

 

[예시]

 

Windows 정의 자료형 중, LARGE_INTEGER가 union을 활용하는 자료형이다. 다음과 같이 선언되어 있다.

typedef union _LARGE_INTEGER {
    struct 
    {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct 
    {
        DWORD LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;

 

이걸 64bit C++ 환경에 맞춰 변경하면 다음과 같이 볼 수 있다.

typedef union _LARGE_INTEGER {
    struct 
    {
        int LowPart;
        int HighPart;
    };
    struct 
    {
        int LowPart;
        int HighPart;
    } u;
    __int64 QuadPart;
};

 

QuadPart는 8byte 자료형이기 때문에, _LARGE_INTEGER의 메모리는 다음과 같은 구조를 갖는다.

 

LowPart

                HighPart

QuadPart

[  ][  ][  ][  ][  ][  ][  ][  ]

'C++' 카테고리의 다른 글

[C++] 좌측값과 우측값(lvalue and rvalue)  (0) 2025.05.15
[C++] 복사 생략(Copy Elision)  (0) 2025.05.15
[C++] 클래스 template  (0) 2025.05.13
[C++] 함수 template  (0) 2025.05.13
[C++] 람다  (0) 2025.05.13

+ Recent posts