본문 바로가기
3. 개발 관련/공부 :: c

C :: padding / packing / bit fields

by kyuho.choi 2023. 4. 20.
728x90
반응형

개발의 규모가 커지거나, 정확한 사이즈로 특정 영역을 관리해야 할 때,
padding / packing / bit fields 지정 등을 주로 사용 한다.

  • padding
struct foobar {
 int a; // 4 byte
 char b; // 1 byte
 }

위 코드의 사이즈는 8 byte 이다. architecture 에 따라 다르나, 일반적으로 word 단위의 memory alignment 로 처리되며, 이러한 사이즈를 컴파일러 수준에서 맞추어 주는 작업을 structure padding 이라 한다.
 
간략하게 정리하면 아무것도 안하면, 그냥 다 alignment 에 맞게 padding 된다.

  • #pragma pack()
  • attribute packed
struct foobar {
 int a; // 4 byte
 char b; // 1 byte
 unsigned long c; // 4 byte
 char d[8]; // 8 byte
}

기본적인 struct 의 형태가 위와 같다고 할 때, padding 은 기본적으로 적용되고 있으며 기본 size는 24 byte 이다.

원하는 사이즈/단위로 alignment 를 이루려면 compiler 에서 이해할 수 있는 설정이 필요하다.
 

  • pragma pack
  • 아래와 같이 pack scope 를 지정해주는 것을 선호한다.
#pragma pack(push, 1)
struct foobar {
 int a; // 4 byte
 char b; // 1 byte
 unsigned long c; // 4 byte
 char d[8]; // 8 byte
}
#pragma pack(pop)

// 이후의 코드는 pack 영향 안받음

#pragma pack(push, 4)
struct foobar {
 int a; // 4 byte
 char b; // 1 byte
 unsigned long c; // 4 byte
 char d[8]; // 8 byte
}
#pragma pack(pop)

 위 케이스는 두가지 packing 을 각각 사용할 때이며,  1 byte pack 시 21 byte, 4 byte pack 시 24 byte 이다.

  • attribute packed
struct __attribute__((packed)) foobar {
 int a; // 4 byte
 char b; // 1 byte
 unsigned long c; // 4 byte
 char d[8]; // 8 byte
}

 pack attribute 지정 시 21 byte 이며 1 byte pack 지정과 같다.

  • bit fields
  • padding/packing 과는 차이가 있으나 struct 내의 멤버들의 size align 에 유사점이 있어서...?
  • 주로 struct member 들에 정확힌 bit 를 사이즈로 할당할 때 사용한다.
  • (예를 들어 여러개의 멤버가 1 byte 를 쪼개어 쓰는 경우 등)
struct foobar {
 u8 a:3; // 3 bit
 u8 b:5; // 5 bit
 unsigned long c:16; // 2 byte
 char d[8]; // 8 byte
}

// bit field with pack
#pragma pack(push,1)
struct foobar {
 u8 a:3; // 3 bit
 u8 b:5; // 5 bit
 unsigned long c:16; // 2 byte
 char d[8]; // 8 byte
}
#pragma pack(pop)

bit field 를 사용하는 경우에는 16 byte 로 할당되는 데, 여기에 1 byte pack 을 추가할 경우 11 byte 로 할당 된다.

728x90
반응형

댓글