반응형
packed란
구조체, 공용체, 클래스 메모리 정렬 방식을 제어하기 위해 사용
일반적으로 구조체 멤버들은 컴파일러에 의해 정렬된다. (alignment)
= CPU 성능 최적화 위해 메모리 주소를 특정 크기(4 Byte, 8 Byte 등)로 맞추는 것
이러한 정렬은 메모리 사용량을 증가시킬 수 있다.
이 경우 packed 속성으로 컴파일러에게 정렬을 무시하고
멤버들을 바로 이어서 저장하도록 지시할 수 있다.
즉, 메모리 접근이나 공간적 측면에서 효율을 높일 수 있지만
성능 손실이나 CPU 비정렬 데이터 접근 문제 초래할 수도 있다.
[예시 코드 1]
__attribute__((packed)) 또는 #pragma pack 사용하여
구조체를 packed로 설정할 수 있다.
#include <iostream>
struct A {
char a; // 1 B
int b; // 4 B
char c; // 1 B
};
#pragma pack(push, 1)
struct B {
char a; // 1 B
int b; // 4 B
char c; // 1 B
};
#pragma pack(pop)
int main() {
std::cout << "구조체 크기: " << sizeof(A) << " bytes" << std::endl;
std::cout << "구조체 크기: " << sizeof(B) << " bytes" << std::endl;
}
Struct A는 멤버 정렬로 Padding이 들어가
□ □ □ ■ | ■ ■ ■ ■ | □ □ □ ■ → 12 B
Struct B는 정렬 무시로 Padding이 없어서
■ | ■ ■ ■ ■ | ■ → 6 B
[예시 코드 2]
#include <iostream>
// 정렬 단위를 1바이트로 설정
#pragma pack(push, 1)
struct PackedStruct {
char a; // 1 B
int b; // 4 B
char c; // 1 B
};
// 이전 정렬 단위로 복원
#pragma pack(pop)
void main()
{
std::cout << "구조체 크기: " << sizeof(PackedStruct) << " bytes" << std::endl;
}
#pragma pack(push, 2) 으로 하였을 때
□ ■ | ■ ■ ■ ■ | □ ■ → 8 Byte 가 나온다.
#pragma pack(push, 3) 이상으로는 하였을 때
컴파일러가 최적화해서 그런지 결과가 12 Byte로 나온다.
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[임베디드/펌웨어] Bitmap Based 연산 예시 (5) | 2024.12.01 |
---|---|
[C++] likely, unlikey 키워드 구문 (5) | 2024.11.10 |
[C/C++] 패딩 비트 (Padding Bit) (2) | 2024.11.09 |
[C/C++] struct 차이 비교 (1) | 2024.11.08 |
[C/C++] #define과 const 차이 (7) | 2024.11.02 |
댓글