__attribute__ 키워드는 GCC 컴파일러가 제공하는 확장기능임. __attribute__는 다음과 같이 3가지로 구분됨.__atribute__ 다음에는 쌍괄호로 싸여진 속성인자가 따라오는 형태임.__attribute__((__used__))
__attribute__((__aligned__(x)))
example : __attribute__((__aligned__(sizeof(long))))
__attribute__((__packed__))
구조체 패딩을 예제로 보자.
//example.c
typedef struct {
int a;
char b;
} test;
typedef struct {
int a;
char b;
} __attribute__((__packed__)) test;
위 코드와 같이 구조체 이름 앞에 __attribute__((__packed__)) 키워드를 사용하게 되면 컴파일러는 구조체의 실제 크기인 5byte를 할당해 사용하지 않는 메모리를 할당하지 않도록 할 수 있다.
여기서 중요한점은 32bit과 64bit에서 구조체 멤버 메모리 접근 위치가 달라질 수 있는데,
이를 해결하기 위해,
1. #pragma pack(push, n)을 이용해 컴파일러가 패딩 비트를 사용하지 않도록 한다.
2. 개발자가 직접 패딩 비트를 삽입한다.
3. 위와 같이 __attribute__((__packed__))키워드를 이용하는 방법이다.