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之后有3个填充字节。 (以及大多数普通的ABI。)

要使数组起作用,总的结构大小必须是其alignof()的倍数:连续内存中的结构,每个结构都占用sizeof(struct s1),而且每个结构的开始都必须对齐,以便int个成员已对齐。

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

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