-
데이터 패킹(
Data Packing
) 은 메모리 효율성을 높이기 위해 데이터 구조를 최적화하여 메모리의 사용량과 접근 속도를 개선하는 기법입니다. -
특히,
CPU
캐시 성능을 극대화 하기 위해 데이터가 메모리에서 연속적이고 압축된 형태로 저장 되도록 설계합니다.
-
현대
CPU
는 데이터를 메모리(RAM Memory
) 에서 캐시(CPU cache
) 로 가져와 처리하는 데 최적화되어 있습니다. -
데이터가 연속적 으로 배치되어 있다면 한 번의 캐시 로드 로 더 많은 데이터를 처리할 수 있습니다.
-
반대로, 데이터가 메모리 여기저기 흩어져 있다면 캐시 미스(
Cache Miss
) 가 발생해 성능이 크게 저하됩니다.- 캐시 미스 관련 글 : https://j2doll.tistory.com/979
-
데이터 패킹은 이러한 캐시 미스를 줄이고
CPU
-메모리 병목 현상을 최소화합니다.
-
컴파일러는 데이터 구조의 메모리를 특정 기준에 맞게 정렬(
alignment
)합니다. -
예를 들어, 4바이트 정수형 변수는 메모리 주소가 4의 배수에 정렬됩니다. 이를 "메모리 패딩(
memory padding
)" 이라고 합니다.
-
c
struct Example { char a; // 1 byte int b; // 4 bytes char c; // 1 byte };
-
위 구조체는 필드 간의 패딩(
padding
) 때문에 메모리 크기가 12bytes
로 늘어납니다:a
(1byte
) 뒤에 3bytes
패딩되어, 4(=1+3) 바이트 차지.b
(4bytes
)는 4-byte
alignment
에 맞게 저장.c
(1byte
) 뒤에 3bytes
패딩되어, 4(=1+3) 바이트 차지.- (1+3) + 4 + (1+3) = 12 바이트 차지
-
데이터 패킹을 통해 불필요한 패딩을 줄일 수 있습니다:
-
c
struct PackedExample { char a; // 1 byte char c; // 1 byte // padding 2 bytes int b; // 4 bytes };
-
위와 같이 필드를 재배치하면 구조체의 크기를 8
bytes
로 줄일 수 있습니다.
-
컴파일러에서 제공하는
#pragma
또는__attribute__((packed))
지시어를 사용하면 강제로 데이터를 압축할 수 있습니다. -
c
// GCC/Clang (g++/clang++) struct __attribute__((packed)) PackedStruct { char a; // 1 byte int b; // 1 byte char c; // 4 bytes }; // MSVC (Visual C++) #pragma pack(push, 1) struct PackedStruct { char a; // 1 byte int b; // 1 byte char c; // 4 bytes }; #pragma pack(pop)
-
구조체에 패킹(
packing
)을 적용하면 총 크기는 6바이트
- 메모리 사용을 시각화하거나 디버깅할 때, 데이터 구조의 크기와 정렬 상태를 확인하는 도구를 사용할 수 있습니다:
sizeof()
함수로 구조체 크기 확인offsetof()
로 필드의 메모리 오프셋 확인
- 메모리 사용량 감소
- 캐시 친화적인 설계로 성능 향상
- 데이터 구조 설계의 효율성 증가
CPU
에서 비정렬된 데이터(non-aligned data
)를 읽는 경우 성능 저하- 하드웨어 플랫폼 간의 데이터 정렬 차이로 인해 이식성 문제가 발생 가능
- 네트워크 프로그래밍 : 네트워크 프로토콜은 데이터를 압축하여 전송하기 위해 데이터 패킹을 사용합니다.
- 임베디드 시스템 : 메모리 제약이 있는 환경에서 데이터 구조를 최소화합니다.
- 그래픽스와 게임 개발 : 다량의 데이터를 빠르게 처리하기 위해 패킹된 버퍼를 설계합니다.
- 데이터 패킹은 데이터 구조 설계 시 메모리와 성능을 모두 고려해야 하는 고급 최적화 기법입니다.
- 그러나 성능과 이식성 간의 트레이드오프를 이해하고 적절히 사용할 필요가 있습니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
- 일부 모바일 환경에서는 ❤️ 버튼이 보이지 않습니다.
'C C++' 카테고리의 다른 글
거짓 공유(False Sharing) 방지 (0) | 2024.11.19 |
---|---|
커스텀 얼로케이터 (Custom Allocator) (0) | 2024.11.19 |
C++20 우주선 연산자 spaceship operator (0) | 2024.11.13 |
C++ Boost의 날짜,시간 및 ACE의 날짜,시간 (0) | 2024.11.12 |
C++ ACE와 Boost Asio의 Proactor 패턴 비교 (0) | 2024.11.12 |