首页 > 解决方案 > 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 个字节,而且它们的类型相同?

标签: cstructx86memory-alignmentabi

解决方案


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

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

看看这两种类型的sizeof()andalignof()以及 int 与 char 的区别。根据 ISO C 定义的 sizeof(char) = 1,在 i386 SysV 中,sizeof(int) = alignof(int) = 4。

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


推荐阅读