메모리를 잡는 방식이 좀 다릅니다. struct의 경우에는 메모리를 잡을 때 각 멤버 변수나 함수가 독립적으로 잡히는데, union의 경우에는 linear하게 하나로 잡힌다고 배웠던 기억이 납니다. union은 서로 다른 타입을 묶어서 메모리상에 하나로 잡아 버리고, struct는 각 변수를 별도로 잡죠. 설명이 이상한데 그림으로 그리면
int, double, char[10]의 변수를 갖는 경우에
union은
|char[10]--|
struct은
|int-| ... |double--| ... |char[10]--|
형태로 잡습니다. 그래서 union은 무조건 해당 멤버 전체의 합만큼의 메모리를 항상 리니어하게 잡아버립니다. (묻지도 따지지도 않고 딱 그 크기만큼은 무조건 잡습니다) 당연히 장단점이 있는데, 포인터로 장난치거나 (boolean등의) 연산 하나로 여러가지를 하고 싶은 경우에는 union이 참 재미있습니다.
'Everything looks different on the other side.' -Ian Malcomm
'Everything looks different on the other side.' -Ian Malcomm
메모리를 잡는
메모리를 잡는 방식이 좀 다릅니다. struct의 경우에는 메모리를 잡을 때 각 멤버 변수나 함수가 독립적으로 잡히는데, union의 경우에는 linear하게 하나로 잡힌다고 배웠던 기억이 납니다. union은 서로 다른 타입을 묶어서 메모리상에 하나로 잡아 버리고, struct는 각 변수를 별도로 잡죠. 설명이 이상한데 그림으로 그리면
int, double, char[10]의 변수를 갖는 경우에
union은
|char[10]--|
struct은
|int-| ... |double--| ... |char[10]--|
형태로 잡습니다. 그래서 union은 무조건 해당 멤버 전체의 합만큼의 메모리를 항상 리니어하게 잡아버립니다. (묻지도 따지지도 않고 딱 그 크기만큼은 무조건 잡습니다) 당연히 장단점이 있는데, 포인터로 장난치거나 (boolean등의) 연산 하나로 여러가지를 하고 싶은 경우에는 union이 참 재미있습니다.
'Everything looks different on the other side.' -Ian Malcomm
'Everything looks different on the other side.' -Ian Malcomm
감사합니다. 많은
감사합니다.
많은 도움이 되었습니다. ^^
이럴 때
union을 쓰면 주로 bit field 패킷 전송 같은 걸 할 때 편리하죠.
패킷을
struct {
unsinged A : 7;
unsigned : 6;
unsigned B : 3;
} AA;
같은 식으로 쓰면 데이터 패킷을 외부로부터 받은 다음에 struct 에 대입해야 하는데 쉽지가 않죠.. 일종의 memcpy()같은 걸 써야 하거든요.
그런데 union 을 아래와 같이
union {
unsigned char coming_packet[2];
struct AA aa;
}
선언하고 오는 패킷을 coming_packet 에 넣으면 자동으로 bit_field를 사용할 수 있게 되죠. 편해요. 일종의 필요악이라고 볼 수 있죠. 여러 곳에서 혼등을 주게되니 가급적이면 union을 쓰지 말라고 하니까요.
도움 많이
도움 많이 되었습니다. 그리고 여쭤보고 싶은것이 있는데
위의 구조체처럼
저런식으로 :을 쓰는 부분이 있던데 저게 무슨 의미인가요?
언뜻 추측해봐선 초기값을 넣는것 같은데 잘 모르겠네요. ㅎㅎ
bit 정의죠
A를 7bit으로 선언한겁니다.
전체를 16bit을 linear하게 잡게 되어 AA를 사용할때 편하게 해주는군요.
답변 감사합니다. ^^
답변 감사합니다. ^^ 막혔던게 빵 뚫린 기분입니다 ㅎㅎ
union
메모리를 낭비를 줄이는게 왜 불필요하다가 생각하시나요?
해당 구조체가 수백/수천번 사용된다면 어떨까요?
거기다 질문 내용에도 포함됐듯이.. 커널 소스라면...
그 커널이 메모리 빠방한 PC나 서버에서 사용될 수 도 있지만...
어떤 장비에 몇메가짜리 메모리에 올라갈수도 있습니다.
댓글 달기