하드웨어의 제약이나 성능상의 이유로 데이터들을 특정한 바이트 경계들에 맞게 배치한다.
이를 바이트 정렬(Byte alignment)라고 부른다. 이때 바이트 경계에 맞추기 위해서 객체의 자료 끝에 추가적인 바이트들을 채우게 된다.
[32bit]
4bytes -> 2bytes -> 1byte
[64bit]
8bytes -> 4bytes -> 2bytes -> 1byte
Struct 에서도 같은 기준이 적용되는데 정렬기준을 찾을때는 구조체의 처음 멤버가 아닌
전체 멤버중에서 가장 큰 데이터 타입을 기준으로 정한다.
여기서 또 한가지 중요한것은 구조체 선언시 멤버들의 순서에 따라 바이트가 늘어 날 수 있다는 것인데..
struct _test
{
char a;
long b;
chat c;
}
는 (long 이 8바이트라고 가정) 24바이트 이지만
struct _test
{
long a;
char b;
chat c;
}
는 16바이트이다.
즉 struct정의시 바이트정렬을 고려하여 멤버의 순서를 정해야 한다.
구조체 내에 또다른 구조체가 선언되어 있는 경우 코드상 상위에 위치한 구조체의 alignment 를 기준으로 한다.
typedef struct _employee
{
int a;
int a1;
char b;
char c;
char d;
}A;
typedef struct _employeeS
{
long b;
A c;
char d;
}S;
위 코드에서 S 구조체의 크기는 24 이다. 이는 A 구조체에서 4bytes 를 기준으로 정렬을 하였기 때문에 S 또한 4bytes 로 정렬된다.
'IT Engineer > Progamming' 카테고리의 다른 글
[C] 구조체 선언 후 바이너리파일 입출력, 바이너리파일에서 파싱하기. 문자열 (포함)검색 등등등 (1) | 2018.06.27 |
---|---|
[C] 구조체 포인터, 구조체 배열 포인터. malloc을 이용한 구조체 (배열) 공간 할당받기 (1) | 2018.06.20 |
[C] 구조체 배열, 데이터 담아서 sorting 하기(버블정렬) (0) | 2018.06.20 |
[C] for, while문 이용 - 직각삼각형 만들기, 정삼각형 만들기 (0) | 2018.06.20 |
[C] 데이터타입에 대한 겅부2 - 그것에대한 scanf (0) | 2018.06.20 |