不同系统下的C语言类型长度
image.png
概念
某种类型对象的地址必须是某个值K(通常是2,4或8)的倍数。如果一个变量的内存地址正好位于它长度的整数倍,就叫做自然对齐。
对齐简化了行程处理器和存储器系统之间的接口的硬件设计。

Example

  1. #include<stdio.h>
  2. int main()
  3. {
  4. struct test {
  5. char a;
  6. short b;
  7. int c;
  8. long d;
  9. };
  10. struct test t = {'a',11,11,11};
  11. printf("size of struct t = %u\n", sizeof(t));
  12. return 0;
  13. }

image.png
总共16

struct test2 {
    int a;
    long b;
    char c;
};

image.png
总共24

struct test1 {
    int a;
    long b;
};

image.png
总共16

struct test4 {
    char a;
    struct test1 b;
    int c;
};

image.png
将test1进行了拆开,同时test4.a到test4.b还是按照test4中的最大值来进行对齐的。

处理字节对齐


编译器处理字节对齐的原则

  • 数据类型自身的对齐值:为指定平台上基本类型的长度。对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
  • 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
  • 指定对齐值:#pragma pack (value)时的指定对齐值value。
  • 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。


结构体类型的对齐

当数据类型为结构体时,编译器可能需要在结构体字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐排放(对于非对齐成员需要在其前面填充一些字节,保证其在对齐位置上),结构体本身也要根据自身的有效对齐值圆整(就是结构体总长度需要是结构体有效对齐值的整数倍),此时可能需要在结构末尾填充一些空间,以满足结构体整体的对齐—-向结构体元素中最大的元素对齐。