元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。

通常在一个结构体中,嵌套了别的结构体的时候。

例如:在linux中默认4字节对齐,如果结构体中,第一个结构体变量14字节,第二个20字节,第三个8字节,那么第一和第二个之间就会出现两个字节的空挡,直接内存dump的时候就会出问题,而且问题很隐蔽。答案就不是42了,是(14+2+20+8=44)

平台问题(移植问题):不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地质处取某些特定类型的数据,否则跑出硬件异常。

性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存只需要访问一次。

起始情况:第一个成员在与结构体变量偏移量为0的地址处。

中间情况:成员变量的位置必定是编译器默认的一个对齐数 与 该成员大小的较小值的整数倍。

结尾情况:结构体的总大小为结构体最宽基本类型成员大小的整数倍。

默认情况:VS中默认对齐数的值为8, Linux中的默认值为4。

e小于对齐数自身大小作为对齐数则存放在16+8=24处那么总大小为28

但由于结构体大小必须为默认对齐数的整数倍所以总大小为32.

添加上结构体嵌套这次默认对齐数为8

总大小为108

但由于结构体大小必须为默认对齐数的整数倍所以总大小为112.