비트필드

언어로그/C/C++ 2010. 12. 10. 20:07

구조체 포인터

struct  _STUDENT {
    char name[20];
int kor, eng, math, science, tot, grade;
    double avg;
} STUDENT;


STUDENT student[3];
STUDENT *ps = &student;

student[i].name  ==  (*(ps + i)).name == (ps + i)->name
  • 구조체 포인터를 사용하여 멤버에 접근하기 위해서, (->) 연산자를 사용한다.
  • student 구조체의 name 멤버에 접근하기 위해, 위와 같이 다양한 방법을 사용할 수 있다.


패딩(Padding) 바이트

  • 컴퓨터가 다루는 데이터의 단위를 워드라고 한다. 흔히 32비트 컴퓨터, 64비트 컴퓨터 하는데, 이때의 비트가 바로 워드이다.
  • 멤버들이 서로 다른 크기를 갖는 구조체의 경우, 32비트의 컴퓨터의 경우 1워드인 4바이트씩 데이터를 읽게 된다.
  • 하지만 4바이트 보다 적거나 큰 데이터를 읽기 위해선 1번 또는 2번을 읽어 경계에 있는 비트들을 합쳐줘야 하는 번거로운 연산을 추가적으로 해야한다.
  • 이런 번거로움을 덜기위해 추가적인 패딩 바이트를 붙여서 워드 단위로 좀 더 빠르게 읽을 수 있게 한다.
typedef struct {
    char ch;
    int i;
    double d;
} TYPE1;

typedef struct {
    int i;
    char ch;
    double d;
} TYPE2;


typedef struct {
    double d;
    char ch;
    int i;
} TYPE3;

typedef struct {
    char ch;
    double d;
    int i;
} TYPE4;
  • 패딩바이트를 보기위해 4개의 구조체를 위와 같이 선언을 하고, 그 크기를 다음과 같이 출력해보았다.
printf("TYPE1 : %d \n", sizeof(TYPE1));
printf("TYPE2 : %d \n", sizeof(TYPE2));
printf("TYPE3 : %d \n", sizeof(TYPE3));
printf("TYPE4 : %d \n", sizeof(TYPE4));  

그 결과는 다음과 같다.

TYPE1 : 16

TYPE2 : 16 

TYPE3 : 16

TYPE4 : 24  
  • int형 4바이트, char형 1바이트, double형 8바이트 총 13바이트가 출력되야 하지만, 그렇지 않다.


비트 필드 (bit field)

  • 구조체 비트 필트는 파일에 대량의 데이터를 저장할 때, 소모되는 메모리 공간을 줄이기 위해 구조체 멤버들에게 비트단위로 공간을 할당하여 메모리를 사용하는 방법이다.
  • 소량의 데이터를 다룰 때는 비트필드 처리를 위한 부가작업으로 오히려 득보다는 실이 많게 됨을 주의하자

(0~9999)년 (1-~12)월 (1~31)일에 대한 정보를 갖는 데이터를 저장하려 할 때, 모두 4바이트 정수형으로 정의하지 않고, 갖을 수 있는 데이터의 범위를 고려해 year는 15비트, month에 4비트, day에 비트를 할당한 비트 필드는 다음과 같다.

typedef struct {
    unsigned int year : 15;
    unsigned int month : 4;
    unsigned int day : 5;
} NEW_DATE;

콜론(:) 다음에 해당하는 멤버에 할당되는 비트수를 명시해준다. 비트필드는 unsigned 타입에만 지정할 수 있다. 위와 같은 선언은 다음과 같은 메모리 구조를 가지게 된다.



  • 주의할 점으로 비트필드로 선언된 구조체에는 scanf 를 사용하여 입력을 받을 수 없다.
  • scanf는 인자로 메모리의 주소를 받지만, 주소는 바이트 단위단위로 할당되기 때문에 비트 단위로 설정되기 때문이다.
  • 그래서 위와 같은 경우 int 형 임시변수를 선언하고 scanf로 입력받은 후, 비트필드의 멤버에 할당하는 방법 사용한다.
  • 하지만 이때도, 4바이트 데이터가 비트필드로 할당시 메모리 잘림현상이 발생하기 때문에, 데이터 손실하 않도록 주의해야 한다.


'언어로그 > C/C++' 카테고리의 다른 글

C 프로그램 실행과정  (0) 2011.02.22
C 언어란?  (0) 2011.02.22
비트필드  (0) 2010.12.10
함수의 이해 / 데이터 전달  (0) 2010.12.10
과제 #3 함수, 포인터의 사용  (0) 2010.12.10
과제#4 배열과 문자열  (0) 2009.10.03