어떤 객체를 표현하는 여러 변수를 맴버로 가지고 있는 구조체가 있다고 가정하자.

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

하지만, 구조체의 맴버 변수들이 아주 작은 범위의 값(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
« PREV : 1 : ··· : 15 : 16 : 17 : 18 : 19 : 20 : 21 : 22 : 23 : ··· : 228 : NEXT »