[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 |