union

김대익·2022년 3월 22일
0

union은 메모리를 절약하기 위한 클래스타입이다.

위와같이 int와 double을 가진 struct와 union의 크기를 비교해보면

struct는 16bytes, union은 8bytes를 갖는것을 알 수 있다.

메모리구조를 보면

struct는 4bytes의 타입이면 4의 배수, double은 8의 배수로 메모리를 차지하여
int 4bytes를 저장한 뒤 4bytes를 패딩하여 8의 배수의 위치를 만들어주어 16bytes를 차지하게된다.


union은 메모리를 서로 공유하여 가장 큰 double의 8bytes의 크기만 가지게된다.
한번에 저장이 된다는 것이 아니라, int또는 double 하나만 저장이 가능하다는 것


위와 같이 저장하면

u.d를 저장했을 때 u.i를 출력하면 이상한 숫자가 나오는 것을 볼 수 있다.
이는 0.3을 저장했을때의 8bytes의 bit정보를 4bytes까지만 잘라서 읽어오기 때문이다.



union은 vector도 사용이 가능한데
위와같이 개발자가 constructor와 destructor를 모두 신경써줘야하므로 조심히 사용해야한다.


std::variant는 u.d를 저장했을 때 u.i를 출력하면 이상한 숫자가 나오는 것과
constructor, destructor를 신경쓰지 않게 해준다.

0개의 댓글