对齐概念
如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。
为什么要字节对齐
- 需要字节对齐的根本原因在于CPU访问数据的效率问题、
- 。。。
正确处理字节对齐、
对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:
数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
联合 :按其包含的长度最大的数据类型对齐。
结构体: 结构体中每个数据类型都要对齐。
比如有如下一个结构体:
struct stu{
char sex;
int length;
char name[10];
};
struct stu my_stu
什么时候需要设置对齐
在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.
对于32位机来说,4字节对齐能够使cpu访问速度提高
实例1
字节对齐的问题主要就是针对结构体。 例如:
struct B{
char b;
int a;
short c;
};
假设B从地址空间0x0000开始存放,且指定对齐值默认为4(4字节对齐)。成员变量b的自身对齐值是1,比默认指定对齐值4小,所以其有效对齐值为1,其存放地址0x0000符合0x0000%1=1。成员变量a自身对齐值为4,所以有效对齐值也为4,只能存放在起始地址为0x0004~0x0007四个连续的字节空间中,符合0x0004%4=0且紧靠第一个变量。变量c自身对齐值为 2,所以有效对齐值也是2,可存放在0x00080x0009两个字节空间中,符合0x0008%2=0。所以从0x00000x0009存放的都是B内容。
再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0x00000x0009=10字节,(10+2)%4=0。所以0x0000A0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12。
这里从0000存放,存放四个字节,即0x0000-0x0003,后面则是从0x0004开始存放,因为前面已经存放了第一个,即0x0004-0x0007,后面从0x00008开始