字节对齐(结构体)

直接从问题入手,下面这个结构体,占多大内存,也就是求sizeof(A)是多少

struct A 
{
    int a;
    char b;
    double c;
};

这就涉及到一个字节对齐的问题,字节对齐有下面这样的规则。

①一个结构体的大小一定是其结构体内成员,最大数据类型的整数倍,因为结构体在分配内存大小的时候是按照最小单位(这个最小单位是我自己取得名字,意思就是最大数据类型)来创建的。

就像上面我举出的一个例子,其中,最大的数据类型是double,double是占8个字节,所以8就是我上面所说的最小单位。

②余下的空间不够了就新开辟一个最小单位的空间,并且从新开辟的地方开始存放变量,不会去用前面用剩下的空间。

就像上面我举出的一个例子,经由①,我们已经知道结构体A的最小单位大小是8,所以,我们一开始在存放int型数据的时候就把int放里面了,然后还剩下4个字节大小的空间,放第二个变量char还够,所以就继续放,至此,我们一共申请的空间只有8,还剩下3个字节大小的空间没有用过,显然,这不够我们8个自己大小的double放了,于是,为了存放double类型的变量,系统就会再去申请一片8字节大小的空间。

至此,我们一共申请了8+8=16字节大小的空间,因此,sizeof(A)也就是16了。

其实字节对齐的重要内容就上面这么些。另外我还想提一句有关位域的知识。

一些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。

位域就是限定一个变量占多少位,还有一个规定:位域宽度不能超过它所依附的数据类型的长度

struct A 
{
  char a : 5;
  char b : 4;
  char c : 7;
};

结构体的字节对齐规则还是没有变,这里还是按照最大的元素的整数倍去给结构体分配内存,但是由于有了位域,因为其可精确到位,其就可以更加细致得去分配结构体内存空间,可以减少一些不必要的分配间隙。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值