内存对齐
规则1:对于结构体第一个成员,偏移为0;以后每个数据成员,偏移=[min(#pragma pack(),sizeof(自己))的倍数]
规则2:完成规则1后,结构或联合本身也要进行对齐,临时值=min(#pragma pack(),sizeof(结构或联合中字节最长的数)),最终字节数=临时值的整数倍并且最接近规则1字节数(不够则添加)
例:struct{char,int,short},sizeof()大小为12
内存对齐主要作用
程序员心目中的内存印象,由一个个的字节组成,而CPU并不是这么看,CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的.块大小称为memory access granularity(粒度)
假设CPU要读取一个int型4字节大小的数据到寄存器中,分两种情况讨论:
1:当该数据是从0字节开始时,CPU只需读取内存一次即可把这4字节的数据完全读取到寄存器中
2:当该数据是从1字节开始时,此时CPU先访问一次内存,读取0-3字节的数据进寄存器,并再次读取4-5字节的数据进寄存器,接着把0字节和6,7,8字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器