1、内存对齐
不管是结构体,还是普通的变量都存在内存对齐
2、规则
只能放在自己类型整数倍的内存地址上。
可以简单理解成:
内存地址 / 占用字节 = 结果可以整除
例如:
int存放的位置:内存地址一定能被4整除
long long存放的位置:内存地址一定能被8整除
double存放的位置:内存一定能被8整除
3、结构体的内存对齐
结构体内存的总大小,是最大数据类型的整数倍(用来确定最后一个数据补位的情况)
在内存对齐的时候,会补上空白字节,并不会改变原本数据类型的字节大小。
例如:在char类型后面补了4个或者多个空白字节,char类型本身在内存中占用的空间还是1个字节。
4、练习
判断结构体的内存大小:
(1)练习1,如图:


如图,是上面结构体在内存中的占用字节情况
第一个数据类型是double,字节数为8,0可以是任何数的倍数,所以double类型从0索引开始占用;
char类型,字节数为1,任何数都可以是1的倍数,所以占用索引8的内存
int类型,字节数为4,由于9-11之间都没有4的倍数,所以会填补空字节,这里用NULL代替。
char类型,占用索引16的内存;此时所有的属性都占用了内存,但是结构体会进行内存对齐,最后的内存大小是最大数据类型的属性的倍数,即double的倍数,在0-16之间由于空间都被占用,所以要继续往下占用字节,到24便停止,17-24全部填补空字节。

(2)练习2,如图:


如图,如果把数据类型小的放到前面,会节约内存空间。

