본문 바로가기
프로그래밍/C

구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결

by eteo 2022. 4. 20.

구조체의 크기가 생각과는 달라서 당황했던 적이 있는데 구글링을 통해 쉽게 답을 찾았다.

 

위 구조체의 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바이트 단위로 정렬이 된다.