하드웨어의 제약이나 성능상의 이유로 데이터들을 특정한 바이트 경계들에 맞게 배치한다. 
이를 바이트 정렬(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 로 정렬된다.


+ Recent posts