小盒子的小盒

什么是字节对齐?字节对齐的原理

0
阅读(2219)

1.数据类型自身的对齐值
  对于char型数据,其自身对其值为1,对于short型为2,对于int,float,double类型,其自身对其值为4,单位:字节

2.结构体或者类的自身对其值
  其成员中自身对其值最大的那个值。

3.指定对其值:
  #pragma pack(vlaue)时的指定对其值value。

4.数据成员、结构体和类的有效对其值:
  自身对其值的指定对其值中小的那个值。

  有了这些值,我们就可以很方便的来讨论具体数据结构的成员&其自身的对其方式。有效对其值N是最终来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数据结构的起始地址,结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐圆整(就是结构体成员变量占用总长度需要是对结构体有效对其值的整数倍,结合下面例子解释)。这样就能理解上面的几个例子的值了。
分析例子:
struct B
{
  char  b;
  int   a;
  short c;
};
假设B从地址空间0x0000开始排放。该例子中没有定义指定对其值,在笔者环境下,该值默认为4。第一个成员变量b的自身对其值是1,比指定或者默认指定对其值4小,所以其有效对其值为1,所以其存放地址0x0000符合0x0000%1=0,第二个成员变量a其自身对其值为4,所以有效对其值也为4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对其值为2,所以有效对其值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的都是B内容。再看数据结构B的自身对其值为其变量中最大对其值(这里就是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求,0x0009到0x0000=10字节,(10+2%4=0)所以0x000A到0x000B也为结构体B所占用。故B从0x0000到0x000B共有12个字节,sizeof(structB)=12。
分子例子
#pragma pack(2) //指定按2字节对齐
struct C
{
  char  b;
  int   a;
  short c;
};
#pragma pack() //取消指定对齐,恢复缺省对齐
第一个变量b自身对其值为1,指定对齐值为2,所以其有效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合0x0000%1=0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续字节中,符合0x0002%2=0。第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放在0x0006、0x0007中,符合0x0006%2=0。所以从0x0000到0x0007共八个字节存放的是C的变量。又C的自身对齐值为4,所以C的有效对齐值为2。又8%2=0,C只占用0x0000到0x0007的八个字节,所以sizeof(struct C)=8