구조체 멤버를 비트단위로 선언할 수 있는 구조체 입니다.
struct st { unsigned int a : 2; unsigned int b : 3; };
이런 식으로 표현합니다. 즉 일반 구조체의 멤버 산언과 동일하나 멤버명뒤에 : n 으로 비트수를 지정합니다. 예제? 위에 선언한 구조체를 이용하겠습니다.
struct st x = {1,5};
이렇게 하면 x.a는 1, x.b는 5 가 들어갑니다. 즉, a는 2비트인데 1이 들어가므로 2진수로 보면 01 이 들어가게 됩니다. b는 3비트인데 5가 들어 가므로 2진수로 보면 101 이 들어가게 됩니다 즉, 일반 구조체 사용하듯이 사용하면 되는 겁니다. 사용하는 경우? 뭐 다양하게 사용되겠지만 flag선언때 많이 사용합니다. (이걸 어떻게 설명드리지요?) 또한 어떤 데이터 스트림(헤더정도 등)의 parsing에도 많이 쓰입니다. 예를들어 총 4바이트 헤더에서 처음 3비트는 어떤 정보이고 다음 8비트는 뭐고 그다음 몇비트는 뭐고 하는 식으로 비트들로 필드가 구분되어 있다면 이들 필드들만 억세스 하기 위하여 비트필드를 선언하여 사용합니다.
장점? 아무래도 변수를 비트로 사용하니까 메모리가 줄어들겠죠 예를들어 int a = YES; a = NO; (여기서 YES, NO는 1과 0으로 사전 define된것으로 가정) 이렇게 a가 사용된다면 a는 4바이트 변수인데 실제 저장하는 값은 0 아니면 1 혹은 YES, NO 등 입니다. 따라서 이런 경우는 1비트면 충분하지요 만약 이런식의 변수들이 여러개 있다면 이들을 묶어서 하나의 구조체로 만들고 그 내부 필드를 비트필드로 하는 거지요 그럼 메모리 총량이 감소되어 절약이 가능합니다.
단점? 전체 32비트 메모리(비트필드 이지만 구조체의 최소크기는 int가 됨)에서 특정 비트들만 값을 변경하면 즉 위의 구조체에서 x.a = 1을 하면 실제 이 코드는 1을 그냥 a에 대입하는 것이 아니라 실제 코드는 (x & 3 | 1) 로 처리되어 비트 연산을 수행하게 됩니다. 결국 메모리는 아끼지만 속도는 느려지는 거지요
메모리는 먼저 선언된 멤버가 낮은비트(0번지크)부터 채워집니다. 위의 구조체는 32비트(int)로 총 사이즈가 잡힙니다.
그 32비트에서 하위 두비트 0,1 비트는 a가 그 위의 3비트 3,4,5 비트는 b가 위치합니다. 나머지 비트들은 사용되지 않습니다.
이해 되실런지요? |
Comments