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));
'컴퓨터 공학 > C++' 카테고리의 다른 글
[C++] NativeMessaging으로 크롬 확장 앱과 C/C++ 앱 통신하기 (0) | 2019.11.27 |
---|---|
[C++] vector 컨테이너 반복문 종류별 성능 (0) | 2019.11.14 |
vector와 array의 처리 성능 높이는 방법 (실험) (1) | 2019.11.14 |
[C++11] 초간단 시간 측정 클래스 (0) | 2019.11.14 |
C++ 함수 내 람다 함수를 통해 코드 정리 (0) | 2019.11.14 |