1. 对齐的作用和原因:提高存取效率(注:有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐)
2. 如何确定如下结构体的大小
struct B
{
char b;
int a;
short c;
};
A. 数据类型自身的对齐值:
对于char型数据,其自身对齐值为1,对于short型为2,对于int类型为4单位字节、
B. 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
C. 指定对齐值:#pragma pack (value)时的指定对齐值value
D. 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
假设B从地址空间0×0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指定对齐值4小,所以其有效对齐值为1,所以其存放地址0×0000符合0×0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4,所以只能存放在起始地址为0×0004到0×0007这四个连续的字节空间中,复核0×0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为 2,所以有效对齐值也是2,可以存放在0×0008到0×0009这两个字节空间中,符合0×0008%2=0。所以从0×0000到0×0009存放的都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0×0009到0×0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0×0000到0x000B 共有12个字节,sizeof(struct B)=12;