일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- C언어 #부록
- Bandit
- C++ 언어 # 핵심정리
- HTML #핵심정리
- C++ 언어 #핵심정리
- shell_script
- C언어 # 핵심 정리
- MySQL #핵심정리
- C언어 # 부록
- Hacking #Baic
- PHP #핵심정리
- C언어 #핵심정리
- C++ 언어 # 핵심 정리
- Today
- Total
cCcode
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이 나옵니다.
'C Language Basic' 카테고리의 다른 글
[부록] 산술 연산 계산기 (완성본) (0) | 2021.06.19 |
---|---|
C Language [핵심정리] - 29 (0) | 2021.06.15 |
C Language [핵심정리] - 27(수정) (0) | 2021.06.11 |
[부록] 문자열 함수들을 이용한 간단한 프로그램(완성본) (0) | 2021.06.09 |
C Language [핵심정리] - 25 (0) | 2021.06.08 |