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

[C/C++] packed 키워드

by 까망 하르방 2024. 11. 16.
반응형

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

C++ packed 예시 코드 결과


[예시 코드 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 가 나온다.

C++ packed 예시 코드 결과



#pragma pack(push, 3) 이상으로는 하였을 때
컴파일러가 최적화해서 그런지 결과가 12 Byte로 나온다.

반응형

댓글