출처: 지식IN(
)http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=3272
__attribute__는 GCC 컴파일러에 있는 메커니즘으로 컴파일러에게 추가적인 에러 체킹같은 것을 하도록 지시하는 것이다.
형식 : __attribute__ (x)
괄호 안의 x에는 가능한 몇 가지들이 있다. 특히, packed는 채우라는 의미이다.
typedef struct
{
char a;
int b;
} myST;
위 구조체의 sizeof(myST)는 8이다.
상식적으로, char =1byte, int = 4byte이므로, 5가 나와야 하는데.. 이런 문제때문에, 구조체를 가지고 작업할 경우 예상치 못한 버그로 고생을 가끔한다.
이런 현상이 생기는 이유는, 현재 사용하는 컴퓨터는 32비트이다. 즉, CPU가 메모리 어드레스를 지정할 때 4바이트(32비트/8) 단위가 내부적으로 가장 최적화되어 빠른 데이터 접근을 가능하게 한다. 4바이트 배수 단위가 아닌 경우 당연히 접근은 가능하지만 속도 차이가 있어, 디폴트로 저런 접근을 하도록 해 둔 것이다.
그럼, 메모리에 저 구조체가 잡힐 경우 어떻게 존재하느냐는, 4바이트 단위로 채워지기 때문에, char a;는 1바이트이지만, 4바이트를 할당해서 거기다 char a;를 담아둔다. 다음, int b;는 4바이트므로 그냥 4바이트를 할당한다. 이렇게 해서 8바이트의 크기가 필요한 것이다.
첫 char a;에서 1바이트를 제외한 나머지 3바이트는 어떤 걸로 채워질까? 의미없는 값이 채워진다. 그냥 공간만 예약되는 것이다.
그래서, 이런 현상을 방지할 수 있도록, 컴파일러는 __attribute__ ((packed)) 메커니즘을 두어서 우리가 예상한 1바이트+4바이트, 크기가 되도록 빌드한다.
typedef struct
{
char a;
int b;
} __attribute__ ((packed)) myST;
결국, 위 처럼 사용하게되면, 컴파일러는 구조체 멤버 실제 크기 만큼 할당한다. 그래서 정확한 5바이트가 나오게된다. 물론, 속도는 약간 더 늦어진다.
여기에서 __attribute__라는 의미는 , 컴파일러에게 특성을 주겠다는 것을 의미하며 괄호 안은 여러 가지가 가능한데, 여기서는 그 중 한가지인 구조체 정렬을 사용하겠다는 의미인 packed를 사용했다.
packed의 의미는 꽉 채우다라는 것인데, 이 기능을 사용하지 않았을 경우 char a;는 실제 1바이트 외에 나머지 3바이트가 자리만 차지한 채 남아있다. 이런 비어있는 것들을 제거해서 구조체 멤버들이 빈 자리없이 꽉 채우라는 단어 의미이다. 이런 것을 구조체 정렬(alignment)이라고 한다.
위는 unix/linux의 GCC에서 사용하는 것이고 윈도우 상의 비주얼 씨의 경우는
#pragma pack(1)
처럼 사용한다. 괄호 안의 의미는 1바이트 단위까지 체크해서 빈 자리없도록 차곡차곡 채우라는 것이다. 4가 올수도 있겠지만, 그렇게 되면 가장 작은 단위가 4가되어 char 형 같은 경우 역시 4로 채워지게 되어 낭패이다. 따라서 확실한 경우 아니면, 위 처럼 사용하면 된다.
'도움받은 정보' 카테고리의 다른 글
숨김파일 표시 안될 때 (0) | 2010.03.23 |
---|---|
고속도로와 소방서 (0) | 2010.03.19 |
윈도우XP 최적화 팁 모음 (0) | 2009.07.28 |
Virtualbox could not create temporary directory. (0) | 2009.07.28 |
네로 서치 제거법 (0) | 2009.07.28 |