구조체의 크기가 생각과는 달라서 당황했던 적이 있는데 구글링을 통해 쉽게 답을 찾았다.
위 구조체의 size는 1 byte가 맞다.
하지만 구조체 안에 여러 자료형이 들어있으면 어떻게 될까?
#include <stdio.h>
typedef struct {
char a; // 1 byte
int b; // 4 byte
double c; // 8 byte
} TEST;
int main(void) {
TEST test;
printf("구조체멤버 a의 크기 : %d\n", sizeof(test.a));
printf("구조체멤버 b 크기 : %d\n", sizeof(test.b));
printf("구조체멤버 c 크기 : %d\n", sizeof(test.c));
printf("구조체 test 크기 : %d\n", sizeof(TEST));
return 0;
}
각각의 구조체 멤버 크기는 1, 4, 8 byte가 맞는데 구조체 전체 크기는 16 byte다.
이런 차이가 나는 이유는,
예를들면 32비트 운영체제에선 4byte씩 데이터를 읽어들이는게 효율적이기 때문에 컴파일러가 4byte단위를 맞춰서 사용하지 않는 패딩비트를 중간에 끼워넣어 정렬한다.
#include <stdio.h>
typedef struct {
char a[10]; // 10 byte
int b; // 4 byte
} TEST;
int main(void) {
TEST test;
printf("구조체멤버 a의 크기 : %d\n", sizeof(test.a));
printf("구조체멤버 b 크기 : %d\n", sizeof(test.b));
printf("구조체 test 크기 : %d\n", sizeof(TEST));
return 0;
}
배열인 경우는 어떨까?
a배열의 크기가 10 byte고 4의 배수를 맞추기 위해 2 byte의 패딩을 넣어서
전체 구조체크기는 16 byte가 되었나보다.
이처럼 패딩비트를 넣는편이 cpu 연산 효율이 높다고 하니 평소에는 그냥 두면 되겠다.
근데 네트워크 통신이나 그림/영상파일 처럼 패딩비트가 있으면 곤란한 경우가 있다면
아래처럼 구조체를
#pragma pack(push, 1)
#pragma pack(pop)
로 감싸주면 패딩비트 없이 1바이트 단위로 정렬이 된다.
'프로그래밍 > C' 카테고리의 다른 글
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 (0) | 2022.04.22 |
---|---|
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 (0) | 2022.04.22 |
64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까? (0) | 2022.04.14 |
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 (0) | 2022.04.12 |
[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) (0) | 2022.04.04 |