结构体字节对齐(vc++)

29 篇文章 0 订阅

结构体字节对齐问题

1.引出问题

     我们先来看两个小程序

      #include <stdio.h>

      struct   fiber1

     {

              char p1;

              short p2;

               int  p3;

   }

      struct   fiber2

     {

              char p1;

               int  p3;

             short p2;

   }

  main()

  {

         printf("the size of fiber1 is %d\n",sizeof(fiber1));

         printf("the size of fiber2 is %d\n",sizeof(fiber2));

 

}

 运行结构是:the size of fiber1 is 8

                        the size of fiber1 is 12

我们发现我们只是改变了变量在结构体的位置,但是运行结果却不一样。

2.原因

我们发现在vc++中,为结构体变量分配内存时与c语言不同。

其规则是:

              在vc++中,为结构体变量分配内存时,先分配一个单位长度,然后在这个单位长度中依次为结构体内的变量分配空间,直到该单位长度空间不能变量分配一个完整的空间为止。再为变量分配一个单位空间。

 

类型      对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char      偏移量必须为sizeof(char)即1的倍数
Short     偏移量必须为sizeof(short)即2的倍数
int   偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double  偏移量必须为sizeof(double)即8的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对
齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边
界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值