Linux/IA32 下的数据对齐

data alignment under Linux/IA32

我遇到了两个结构:

struct s1{
  int i;
  int j;
  char c;}

struct s2{
  int i;
  char c1;
  int j;
  char c2;}

课本上说S1中的c只占1个字节,而S2中的c2占4个字节,这是为什么呢? 是不是因为c1要占4个字节,而且类型一样?

在 i386 System V ABI 的结构布局规则中,s1::c 之后有 3 个字节的填充,与 s2::c1 之后相同。 (以及大多数正常的 ABI。)

总结构大小必须是其 alignof() 的倍数,数组才能工作:连续内存中的结构,每个占用 sizeof(struct s1),而且每个结构的开头都对齐,因此int 成员对齐。

查看两种类型的 sizeof()alignof(),以及 int 与 char。 ISO C 定义的 sizeof(char) = 1,在 i386 SysV 中,sizeof(int) = alignof(int) = 4.

如果你有一个 struct { char foo[8]; char c; }; 那么它的总大小 只有 9 个字节,因为 alignof(char) = 1.