1、结构体对齐规则

关于结构体对齐上,总结大致有两个规则需要遵守

规则1:偏移量对齐

简单来说,偏移量即为该元素与地址起始点的差值。

成员的对齐值为该成员大小和系统对齐值中的最小值,在32位系统中,系统对齐值为4,64位系统中则为8,同时也可通过#pragma pack(n):设置n字节对齐。成员起始地址的偏移量必须是对齐值的整数倍。

举个例子(假设64位系统)

1
2
3
4
5
struct Demo{
char i;
int x;
double y;
};

该结构体中:

  • 成员i的对齐值为min{1,8} = 1,偏移量为0
  • 成员x的对齐值为min{4,8} = 4,偏移量需为4的整数倍,即为4,所以成员x为4到7
  • 成员y的对齐值为8,偏移量需为8的整数倍,即为8,地址为8-15

综上所述,他占用字节为16。

规则2:结构体总大小对齐

结构体占用的字节数一定为最大成员对齐值的整数倍


2、指针

  • 一级指针
  • 二级指针
  • 函数指针

(未完待续…)