结构体内存对齐规则:
1.第一个成员在与结构体变量偏移为0的地质处。
2.其他成员变量对对齐到某个数字的(对齐数)的整数倍的地址处。
//对齐数=编译器默认对齐数与该成员的较小值。
vs默认对齐数为8。
linux默认对齐数为4。
3.结构体总大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
对齐原因:
1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因:数据结构(尤其是栈)应尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,然后拼凑出数据,而对齐的内存访问一次,就可以得到数据。
一个空结构体的大小为1,不是0的原因是:当你定义多个结构体变量时,由于占0个字节,所有他们的起始地址很可能相同,这是不允许出现的,为了避免浪费所以空结构体的大小为一个字节相对合适。
位段:在一个结构体以比特位为单位来指定其成员所占内存长度。
1.位段的类型为int unsigned,signed,char 几种类型。
2.位段所占的二进制位数,不能超过该基本类型所能表示的最大位数。
3.若位段占的二进制位数为0,这个位段必须为无名位段。
4.位段的存储和位段的总大小跟平台有关系,位段不存在内存对齐。
5.位段是不跨平台的,是由于存储方式导致。