C语言中结构体占用内存大小

这个问题很经典,很容易出现,也叫内存的4k对齐吧

相关知识:

cpu传输数据的方式:

cpu每次传输数据大小由它的总线条数决定,32位传输4个字节,64位传输8个字节。

这里以64位系统举例,若声明一个变量大小为8字节,起始地址位1,而cpu读取的地址为0~7,

则该变量需要读取两次,显然降低了cpu的性能。           

为提高cpu读取的性能,采用补齐的方法提高cpu的效率。即内存为8字节的数据,一定会被一次读取,这当然需要调整变量在内存中的起始地址,使其从0开始。若一个变量不满足8字节,则进行补齐,保证其后一个变量的地址满足cpu读取的初始地址。

补齐:为保证cpu每次读取都是从初始地址开始,对长度不满足8字节的变量进行补全。

结构体的补全规则如下:

结构体A:

第一个变量是char类型,大小为1字节,第二个变量是double,是8个字节。

以大字节为单位进行补齐,将char补齐为8个字节。

第三个变量是int,为4个字节,按照8字节单位进行补齐为8字节。

共占用32字节。

结构体B:

第一个变量是double,占8字节

第二个变量为char,占一个字节,对char进行补齐,为8个字节,char只占用一个字节,后面为补位。

而剩下的字节可以放下int,因此不用再对int进行分配字节,共占据两个字节。

结构体C:

第一个变量是int,占4个字节。

第二个为char,占一个字节,要对char进行补齐,补齐为4个字节(按照结构体中内存最大的类型为单位进行补齐)。

第三个为double,占8个字节,按八个字节进行补齐操作。

总共需要16个字节

结论:不难发现,内存的分配,不仅数据类型相关,还和变量声明的顺序相关。

注意:以结构体中占用字节最大的类型作为补齐标准。

图引用自:C语言计算结构体占用字节大小总数-CSDN博客

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值