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)操作无效

下面提供关于packedaligned的测试数据:

第一组

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