검색결과 리스트
글
비트필드
언어로그/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 |