<C/C++>C语言字节对齐问题总结

       现在打算把自己的掌握的一些东西以博客的形式展现出来,一、作为自己的笔记,防止以后忘记有个博客可以方便自己查询,二、分享出来,如果写的正确可以给还不懂的人一些帮助,如果写错了,别人帮忙指出来,对自己也是一种提高。今天这篇博客打算写一下关于C语言字节对齐的问题。

struct node1{
    char a;
    int b;
    char c;
    int d;
};

struct node2{
    char a;
    char c;
    int b;
    int d;
};

       对于32bit编译器,sizeof(node1)和sizeof(node2)的大小相等吗,大小是多少,如果不等,大小分别又是多少?这就是今天我要讲的字节对齐问题,如果你掌握了上面的问题你将很容易答上来。

        对齐值:
              对于每一个基础类型(如:char、int、short、long、double)他们都有一个字节大小(如char占一个字节等),他们还相对应的存在一个对齐值。但是要明白类型所占的字节数和对齐值不是一样大的。对齐值是可以通过#pragma pack (2) /*指定按2字节对齐*/制定,可以通过#pragma pack ()取消。

对于32bit编译器:
类型charshortintlongdouble
所占字节12448
(缺省)对齐值(byte)12444

对于struct的对齐值,等于在其包含的类型中取最大的对齐值,如上面的struct node1的对齐值=4,应该其所包含的类型中对齐值最大的为int,int的对齐值=4。

我们先运行一段程序,根据程序结果来讲解对齐值的概念:
程序如下:
struct node1{
    char a;
    int b;
    char c;
    int d;
};

struct node2{
    char a;
    char c;
    int b;
    int d;
};

int main()
{
    printf("%d,%d\n",sizeof(node1),sizeof(node2));
    return 0;
}

用32bit编译器,运行结果如下:



       为什么node1的结果是16,而node2的结果是12?下面我们来分析一下,
       1)首先我们先判断node1和node2的对齐值分别是多少,这个答案应该很明显,它们都是4;
       2)对于node1而言,先存储1个byte的a,由于对齐值是4,所以后面还有3个byte空余,接下来存储4个byte的b,因此存放不下,所以从下一个4byte开始,之前的3个byte只能空闲,以此类推,最后node1占16个byte。
       3)对于node2而言,先存储1个byte的a, 由于对齐值是4,所以后面还有3个byte空余,接下来存储1个byte的c,能够存放下,还剩2个空闲的byte,接下来存放4个byte的b,存放不下,从下一个4byte开始,以此类推,最后node2占12个byte。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值