结构体,联合体的对齐

最近做题对于结构体、联合体和类的大小判断,以前对于这些,没有特别的的关注,做题的时候一脸蒙逼,于是想把类,结构体,联合的大小搞清楚!

先看结构体和联合的对齐原则,为了避免混淆,以下均基于32平台,也就是说char类型占1字节,int占4字节,double占8字节:

  • 原则1:数据自身的对齐,它通常是数据类型所占的空间大小,比如int 类型占4个字节,对齐值就是4
  • 原则2:整个结构体的对齐,它一般是结构体最大的数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节
struct test1
{
    int a;
    double b;
};

结构体

对于结构体,按照结构的对齐的规则,先给出几个例子来瞧瞧:

struct A1
{
    double ss;
    char str;
    int aa;
};
struct B
{
    char s;
    double c;
    int a[9];
};

那么我们求A1和B的大小,最终是多少?
根据对齐规则:
先放ss ,它8个字节,也是最大字节,接着放char str,只需要一个字节,最后存储int aa,再放入4个字节,则现在存储需要的空间是:8+1+4 = 13,但是需要整体对齐,需补齐到最大字节数8的倍数。所以sizeof(A1) =16;
同理对于B,最大字节数是8,先放char s,需要补齐至8位,接下来存double c;
最后存储9个int,共36个字节,B总共字节数是8+8+36 = 52;同样的需要对齐,那么sizeof(B)=56;

联合体

联合体的规则也不变,只是联合体有个特点,就是每次用的时候只能用一个数据成员,那么对齐的话应该在满足最大需求的同时,满足最大字节数的对齐;
如下例:

union A
{
    int a[7];
    char b;
    double c;

}a;

最大字节数为8,int a[7]占28个位置,那么需要开辟这么多空间,所以sizeof(A)=32.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值