[해결] union을 왜 쓰나요?

muzie의 이미지

조금 어이없는 질문 같긴 합니다만..
커널소스를 요새 보고 있는데 생각보다 많은 union이 사용되고 있더군요.
교과서적으로 배우는 union의 이점은 제 기억으론 메모리를 낭비하지 않을수 있다는 것과
참조하기 편리하게 해준다는 점 정도밖엔 안떠오릅니다.

하지만 이런것 역시 구조체를 사용한다고 해서 크게 문제될일은 없는 것 같은데
굳이 union을 쓰는 다른 이유가 있는것인가요?

inureyes의 이미지

메모리를 잡는 방식이 좀 다릅니다. 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

muzie의 이미지

감사합니다.
많은 도움이 되었습니다. ^^

라스코니의 이미지

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을 쓰지 말라고 하니까요.

muzie의 이미지

도움 많이 되었습니다. 그리고 여쭤보고 싶은것이 있는데
위의 구조체처럼

unsinged A:7;

저런식으로 :을 쓰는 부분이 있던데 저게 무슨 의미인가요?
언뜻 추측해봐선 초기값을 넣는것 같은데 잘 모르겠네요. ㅎㅎ

inhosens의 이미지


A를 7bit으로 선언한겁니다.

전체를 16bit을 linear하게 잡게 되어 AA를 사용할때 편하게 해주는군요.

muzie의 이미지

답변 감사합니다. ^^ 막혔던게 빵 뚫린 기분입니다 ㅎㅎ

simpid의 이미지

메모리를 낭비를 줄이는게 왜 불필요하다가 생각하시나요?

해당 구조체가 수백/수천번 사용된다면 어떨까요?

거기다 질문 내용에도 포함됐듯이.. 커널 소스라면...
그 커널이 메모리 빠방한 PC나 서버에서 사용될 수 도 있지만...
어떤 장비에 몇메가짜리 메모리에 올라갈수도 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.