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
반응형
댓글