Data structure alignment - Xinrea/Learn GitHub Wiki
以下方法均为GCC扩展方法
E1 默认
struct test {
char a;
int b;
};
test t1;
sizeof(t1) = 8
E2 __attribute__((packed, aligned(X)))
struct __attribute__((packed,aligned(1))) test2{
char a;
int b;
};
test2 t2;
sizeof(t2) = 5
省略aligned(X)
时,相当于默认X=1
其中packed
指结构体内部成员间取消padding,紧凑排列。
aligned
指结构体最终大小应为X的整数倍。注意,未设置packed
时,X的值只会在大于等于结构体中最大的成员大小时生效
E3 #pragma pack(push,X)
#pragma pack(push,1)
struct test3 {
char a;
int b;
};
#pragma pack(pop)
test3 t3;
sizeof(t3) = 5
省略X
时,pack(push)
操作无效
下面提供关于packed
和aligned
的测试数据:
第一组
struct st {
char a;
int b;
char c;
};
Aligned | 1 | 2 | 4 | 8 |
---|---|---|---|---|
Packed | 6 | 6 | 8 | 8 |
Unpacked | 12 | 12 | 12 | 16 |
第二组
struct st {
char a;
double b;
char c;
};
Aligned | 1 | 2 | 4 | 8 | 16 |
---|---|---|---|---|---|
Packed | 10 | 10 | 12 | 16 | 16 |
Unpacked | 24 | 24 | 24 | 24 | 32 |