关于结构体的内存对齐,以及如何计算

文章讲述了C语言中自定义类型,如结构体的大小计算并非简单地将内置类型大小相加,而是涉及到内存对齐的原则。结构体的每个成员会按照其对齐数放置,而结构体的总大小会是所有成员最大对齐数的整数倍。当结构体中包含其他结构体时,同样遵循这一规则,嵌套结构体的大小会基于其内部最大对齐数进行调整。
摘要由CSDN通过智能技术生成

在C语言中,我们的类型有两种一种是内置类型,另一种是自定义类型,今天我们来看一下自定义类型占用字节数的计算

首先我们知道自定义类型中包含一些内置类型,其中内置类型的大小我们是知道的,那么自定义类型的大小是不是里面内置类型直接加起来呢?

我们来看一下

首先我们要知道,自定义类型的大小不是按照里面包含的内置类型的大小加起来的

0ffa6ccf93d649adb5f2af789eec6441.png

 我们可以看到,结构体的大小计算是存在内存对齐的,其中像上图说明的一样,我们一条一条来看

0d3bc87ce9eb471488892fad2dbe6825.png

 首先该结构体中a应该放在该结构体内存存放位置的0字节位置,所以直接放在前四个字节,然后下面是char类型,但是从第二个变量开始就需要放在对齐数的整数倍处,而因为是char类型又因为char类型的对齐数是1,而4是1的倍数所以,刚好可以,而下面是short类型,对齐数是2所以需要放在2的倍数处,这里橙色的是被浪费掉的空间,所以这里也开始放两个字节,而下面的同样是short类型而8刚好是2的整数倍,所以不需要额外浪费空间,在放两个字节,而结构体的最终大小并不是这样就结束了,而最终大小是该结构体中成员的最大的对齐数,的整数倍所以最终该结构体的大小为12个字节

下面我们在看几个结构体(老铁们自己对照观看)

8a19e6bb1c91452184e2af63ea4226d1.png

这两个也是同样如此

d73b06c96e9243498884b122a4e99db1.png 

2f2fa7979658465abc8b371049fb7a12.png 

我们介绍一下下面的一个

590cf26243b9489b84697e7b5c1aa35c.png 

 我们介绍一下这个,我们可以看到这个结构体中包含另外一个结构体,而结构体的基本类型和其他的结构体计算大小没有区别,但是里面包含的结构在对齐的时候需要找到结构体中的最大对齐数进行对齐,然后将该结构体的最终字节数给放进去,而这个结构体的最终大小同样也是按照该结构体中所有的成员里面的最大对齐数的倍数,这里面的最大对齐数包含里面结构体里面的成员。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Naxx Crazy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值