sizeof 数据对齐问题

来源:互联网 发布:手机淘宝国际版 编辑:程序博客网 时间:2024/06/08 08:55
(1)struct A 
{
       char t:4;
  char q:4;   //1
//       unsigned int i:8;
//   unsigned int j:8;
//   unsigned int a:8;
//   unsigned int b:8;
//   unsigned int c:8;
//   char k:4;
//       unsigned int m;
//   double n;
};

sizeof(A)=1;  两个4位 char数据组成一个字节

(2)struct A 
{
     char t:4;
     char q:4;  //1

     unsigned short r:8;  //2         对齐组合成4

      unsigned int i:8;//4
//    unsigned int j:8;
//    unsigned int a:8;
//    unsigned int b:8;
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐为8个字节

(3)struct A 
{
           char t:4;
   char q:4;  //1                对齐成4         

    unsigned int i:8;//4

//    unsigned int j:8;
//    unsigned int a:8;
//    unsigned int b:8;
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐为8个字节

(4)struct A 
{
           char t:4;
         char q:4;     //1         对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;   //4     这四句话组合成4
//    unsigned int c:8;
//    char k:4;
//       unsigned int m;
//    double n;
};
sizeof(A)=8;     两个4位 char数据组成一个字节与整型对齐,4个8位的整型数据组成4个字节,一共有8个字节

5)struct A 
{
           char t:4;
   char q:4;  //1      对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;   //4    对齐组合成4
   unsigned int c:8;    //4   对齐组合成4
   char k:4;               //1      对齐组合成4
//       unsigned int m; 
//    double n;
};

sizeof(A)=12; 

(6)struct A 
{
           char t:4;
   char q:4;        //1     对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4    对齐组合成4
   unsigned int c:8;//4    对齐组合成4
   char k:4;          //1       对齐组合成4
//       unsigned int m;
//    double n;
};sizeof(A)=16; 

(7)struct A 
{
           char t:4;
   char q:4;        //1     对齐组合成4
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4     对齐组合成4
   unsigned int c:8;//4    对齐组合成4
   char k:4;          //4   对齐组合成4
          unsigned int m;  //4   对齐组合成4
//    double n;
};sizeof(A)=20; 

(8)struct A 
{
           char t:4;
   char q:4;        //1
           unsigned int i:8;
   unsigned int j:8;
   unsigned int a:8;
   unsigned int b:8;//4       // 对齐组合成8


   unsigned int c:8;//4
   char k:4;          //4              // 对齐组合成8


       unsigned int m;//4             // 对齐组合成8


   double n;                        //8
};sizeof(A)=32; 与8位double型数据对齐

总结:(1)当最高位为char型数据时,组合成char型数据,此时sizeof为1的整数倍

(2)当最高位为short型数据时,组合成short型数据,可以把其中的不够16位的同一种数据组合起来成16位,不同数据不能组合在一起,此时sizeof为2的整数倍

(3)当出现数据位最高为整型数据,也即32位数据,可以把其中的不够32位的同一种数据组合起来成32位,不同数据不能组合在一起,sizeof为4的整数倍

(4)当出现数据位最高为double数据,也即64位数据,可以把其中的不够32位的同一种数据组合起来成32位,同时可以把不同种数据组合成64位,ziseof为8的整数倍

(5)有符号和无符号数按同一种类型对待,long Int与int按同一种类型对待

(6)首先关注最高位,把相邻的数据组合成最高位。

0 0