C Language [핵심정리] - 28
1. 구조체 정렬 크기 조절
데이터 전송이나 저장을 할 때 구조체 정렬을 피하기 위해 각 컴파일러에서 제공하는 특별한 지시자를 사용해서 구조체 정렬 크기를 조절해줘야 합니다. 왜냐하면 C언어에서는 따로 구조체를 정렬하는 표준 방법이 없거든요.
결과를 보시면 1byte 크기로 정렬했기 때문에 1(flags) + 4(seq) = 5(packet)이 나왔습니다. 즉, 남는 공간이 없기에 구조체 멤버 크기의 합이 구조체의 크기와 같아지는 것입니다. 제가 #pragma pack(pop)을 통해 정렬 크기를 원상태로 돌린 이유는 이렇게 하지 않는 다면 packet 이후에 오는 구조체들 역시 1byte 정렬되기 때문입니다.
만약 GCC 버전이 4.0 미만이라면 #pragma 대신 __attribute__ 를 사용합니다.
GCC(GNU Compiler Collection & GNU C Compiler)란?
GCC는 본래 C언어용 컴파일러로 시작하여, GNU C Compiler의 약자였으나, 2.9버전부터 C언어 뿐만 아니라 Object C 같은 언어를 지원하게 되면서 명칭이 GNU Compiler Collection으로 변경되었습니다. Linux, Window 등 수많은 운영체제를 지원해 높은 호환성을 가지고 있고 많은 최적화를 수행하는 컴파일러입니다. 즉, 여러분들은 GCC 라는 말이 나온다면 "아~ 일종의 C 컴파일러이구나~"라고 생각하시면 될겁니다.
만약 컴퓨터에 gcc가 설치되어 있다면 gcc --version 명령어로 알 수 있습니다.
이처럼 gcc를 이용해 결과를 출력해봤습니다. 해당 window cmd 명령어들은 나중에 따로 정리해서 올릴테니, 지금으로서는 그저 따라 치시기만 하시면 됩니다.
이제 gcc를 통해 __attribute__ 사용해보시죠.
gcc로 실행할 때 한글은 깨지기에 문장들을 모두 영어로 교체했습니다. 순간 글자가 깨지길래 놀랐네요..;;
구조체를 1byte 단위로 정렬했으므로 seq의 상대위치는 1이 나옵니다.