结构体内存对齐的基本规则
1:第一个结构体成员总是从偏移量为0的地址处开始(offsetof(结构体,要访问的结构体成员)宏可以得到偏移量)
2:其他结构体成员,都要对齐到对齐数整数倍的地址处
对齐数=编译器决定的对齐数与结构体成员所占字节的较小值
vs下对齐数为8,比如char 字节为1<8,则下次对齐可在1的整数倍处对齐
linux下没有默认对齐数,对齐数就是成员自身大小
3:结构体的值,是最大对齐数的整数倍
最大对齐数是所有结构体成员中的最大对齐数
4:如果嵌套结构体,那么嵌套的结构体的对齐,按照它内部的最大对齐数对齐,此时,结构体的大小为最大对齐数(含嵌套结构体的最大对齐数)的整数倍
为什么会有内存对齐呢?
1:性能:数据结构(特别是栈)尽可能靠近自然边界对齐
不对齐数据会被访问多次,对齐数据会被访问一次
32位的机器一次性访问4个字节,比如你要访问char和int成员类型,如果不对齐数据char和int都会被访问到
如果对齐数据,char类型的数据就会被跳过,访问int;
2:移植:某些硬件平台可能无法访问某块地址