内存对齐
什么叫内存对齐
内存对齐就是按照特定的规则对数据进行存储,一般编译器按照8字节对齐标准处理。
内存对齐一般用在结构体上,类本质上也是结构体。
内存对齐的规则
1,每个结构体的起始位置为0,结构体内的每个元素的起始地址为自己长度的整数倍(如:int 4字节,起始位置为4的整数倍)
struct charStr{
char b; //1 起始0,长度1
short a; //2 起始2,长度2
}charStr; //sizeof = 4
2,如果结构体里面有结构体,那么内部结构体的起始地址为该内部结构体最大元素的整数倍
struct charStr2{
char a; //起始0,长度1
int b; // 起始4,长度4
int c; // 起始8,长度4
}charStr2; //sizeof = 12;
struct charStr3{
char a1; //起始0,长度1
struct charStr2 a; //起始4,长度12
struct charStr2 b; //起始16,长度12
}charStr3; //sizeof = 28
3,整个结构体的大小要为自己最大元素的整数倍
如上图,本来是27,强行加成28了。
为什么要内存对齐
因为计算机一次读取的数据看数据总线位数,32或者64位。不对齐会导致读取某一个数据需要cpu进行2次读取操作。如第一个结构体,如果是个结构体数组,不对齐,那么,在64位下,第三个结构体就需要读取2次,才能拿到short类型的值。