Search Results for '비트필드'

1 POSTS

  1. 2009.06.05 재미있는 C언어7. 비운의 비트 필드
어떤 객체를 표현하는 여러 변수를 맴버로 가지고 있는 구조체가 있다고 가정하자.

이 구조체의 인스턴스를 캐슁 해야는 상황이라면 이 구조체가 클수록, 인스턴스가 많을 수록 메모리를 많이 필요로 하게 된다.

하지만, 구조체의 맴버 변수들이 아주 작은 범위의 값(char형 보다 작은)을 갖는다고 한다면 메모리가 아깝다는 생각이 든다. 이때 요긴하게 사용할 수 있는 기능이 비트필드이다.

선언 방법은 맴버를 일반적인 정수형으로 선언하되 콜론(:)과 비트필드의 크기를 적어주면 된다.

struct foo 
{
	unsigned int a:4;
	unsigned int b:5;
	unsigned int c:6;
};
위와같이 선언하면 비록 unsigned int로 선언되어 있지만, 각각 4, 5, 6bit씩 메모리에 할당되게되어 그만큼 메모리를 절약할 수 있다.

sizeof(struct foo) 를 출력해보면 4가 나오는 것을 확인 할 수 있다. 이것은 실제 사용하는 bit의 값이 4 + 5 + 6 = 15bit 이지만, 변수 타입이 unsigned int이기 때문에 그렇게 되는 것이다.

struct foo 
{
	unsigned short int a:4;
	unsigned short int b:5;
	unsigned short int c:6;
};
이 경우 sizeof(struct foo)의 값은 2가 된다. 사용법은 일반적인 구조체의 사용방법과 다르지 않지만, 변수 대입시 설정된 비트 이상은 표현하지 못한다.
struct foo 
{
	unsigned int a:4;
	unsigned int b:5;
	unsigned int c:6;
};


int main()
{
	struct foo o;

	o.a = 0xFF;
	o.b = 0xFF;
	o.c = 0xFF;
	
	printf("foo size : %d\n", sizeof(o));
	printf ("%08x, %08x, %08x\n", o.a, o.b, o.c);
	return 0;
}
프로그램의 결과는 다음과 같다. 

 foo size : 4

0000000f, 0000001f, 0000003f 

상황에 따라 나름대로 유용하게 사용될 수도 있는 기능이지만, 애석하게도 사용에 많은 제약이 있다. 

임플리멘테이션(보통 컴파일러라고 표현한다.)에 따라 비트의 메모리상 배치가 다를 수 있어 주의하지 않으면 환경에 따라 중대한 버그를 만들 수 있다.

이러한 이식성 문제 때문에 실제 사용되는 코드를 만나기란 쉬운일이 아니다.

C언어 표준이 좀더 일찍, 임플리멘테이션까지 규칙을 정했으면 좀더 재미있는 C언어가 되지 않았을까? 하는 생각이 든다.

Write your message and submit