结构体-内存对齐

 struct A{
   char c1;
   int i;
   short s;
   int j;
}a;

sizeof(a)的值是16。

分析:char  c1占用1个字节

   int  i占用4个字节,c1不是i的整数倍,所以c1对齐为4个字节

     (c1 + i)占用8个字节

   short  s占用2个字节

        (c1 + i) 是s的整数倍,所以i不用对齐

        (c1+ i + s)占用10个字节

        int  j占用4个字节,(c1 + i + s)不是j的整数倍,所以s对齐为4个字节

        (c1 + i + s + j)占用16个字节,是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以j不用对齐,所以sizeif(a)的值是16。

struct B{
   int i;
   int j;  
   short s;
   char c1;
}b;

sizeof(b)的值是12。

分析:

  int  i占用4个字节,int  j占用4个字节,i是j的整数倍,所以i不用对齐

  (i+j)占用8个字节,short  s占用2个字节,(i+j)是s的整数倍,所以j不用对齐

      (i+j+s)占用10个字节,char  c1占用1个字节,(i+j+s)是c1的整数倍,所以s不用对齐

  (i+j+s+c1)占用11个字节,不是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以c1要对齐为2个字节

  所以sizeof(b)的值为12。

对齐方法总结:

1、前面的成员变量所占字节总数要是下一个成员变量所占字节数的整倍数。

   否则,前面的成员变量中的最后一个成员变量需要对齐,使前面的成员变量所占字节总数是下一个成员变量所占字节数的最小整数倍。

2、所有成员变量所占字节总数要是占用字节数最大的成员变量的整倍数。

   否则,最后一个成员变量需要对齐,使所有成员变量所占字节总数要是占用字节数最大的成员变量的最小整倍数。

  

posted @ 2016-06-08 12:07  小课桌  阅读(121)  评论(0编辑  收藏  举报