하드웨어의 제약이나 성능상의 이유로 데이터들을 특정한 바이트 경계들에 맞게 배치한다. 이를 바이트 정렬(Byte alignment)라고 부른다. 이때 바이트 경계에 맞추기 위해서 객체의 자료 끝에 추가적인 바이트들을 채우게 된다.
32비트 )
4bytes -> 2bytes -> 1byte
64비트 )
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 로 정렬된다.
'Programming > C & C++' 카테고리의 다른 글
[ODBC] ODBC test (0) | 2021.11.16 |
---|---|
[ODBC] SQLSetStmtAttr (0) | 2021.11.16 |
[ODBC] SQLGetInfo (0) | 2021.11.16 |