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 |