[C++] 구조체 정렬 크기 조절하기

C/C++에서 다음과 같이 구조체를 정의할 경우 구조체의 크기는 다음과 같습니다.

struct PlayerData{
	int32_t age; //4
	int16_t height; //2
};

void main() {
	printf("PlayerData 크기: %d\n", sizeof(PlayerData));
}

크기: 8

이는 성능의 최적화를 위해 컴파일러에서 구조체의 크기를 가장 큰 데이터인 int32_t의 배수로 정의했기 때문입니다.

그러나, 네트워크를 통해 바이트 배열 데이터를 받아 바로 구조체에 넣고 싶다면 구조체의 크기가 정의된 데이터 크기와 일치해야 합니다.

이럴 때, 다음과 같이 구조체의 정렬 크기를 조절할 수 있습니다.

#pragma pack(push, 1)
struct PlayerData{
	int32_t age; //4
	int16_t height; //2
};
#pragma pack(pop)

void main() {
	printf("PlayerData 크기: %d\n", sizeof(PlayerData));
}

#pragma pack(push, 1)에서 1은 정렬할 바이트 크기를 의미합니다. 1바이트 단위로 정렬하기 때문에 데이터 크기에 맞게 정렬됩니다.

구조체 마지막 부분에 #pragma pack(pop)을 통해 정렬 대상을 마쳐주어야 합니다.

크기: 6

추가로, 리눅스에서 GCC 버전이 4.0 미만이라면 다음과 같이 구조체를 정의해야 합니다.

struct PlayerData {
	int32_t age; //4
	int16_t height; //2
}__attribute__((aligned(1), packed));