C Language Basic

C Language [핵심정리] - 28

cCcode 2021. 6. 15. 01:30

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 --version

 

C언어 코드
gcc로 c언어 코드 실행

이처럼 gcc를 이용해 결과를 출력해봤습니다. 해당 window cmd 명령어들은 나중에 따로 정리해서 올릴테니, 지금으로서는 그저 따라 치시기만 하시면 됩니다.

 

이제 gcc를 통해 __attribute__ 사용해보시죠.

c언어 코드
결과

gcc로 실행할 때 한글은 깨지기에 문장들을 모두 영어로 교체했습니다. 순간 글자가 깨지길래 놀랐네요..;;

 

구조체 정렬 1byte
결과

구조체를 1byte 단위로 정렬했으므로 seq의 상대위치는 1이 나옵니다.