golang 结构体和内存对齐

在这里插入图片描述

内存和CPU之间的交互, CPU通过地址总线去内存选址 如果地址总线 8 位则能找到 256 个地址所以,只能用到256的内存。 32位 地址总线就可以寻址 4G内存。每次操作一字节太慢,如果每次操作4字节,则需要32位数据总线,如果每次操作8字节则需要64位地址总线。
在这里插入图片描述
在这里插入图片描述

内存的设计是上图, 每次寻址是从不同的chip中选出相同位置的一个字节,来组成一个连续的8个字节。通过这样的并行操作,提高了内存访问效率,但是这样的设计,address的选址必须是8的倍数。
在这里插入图片描述
在这里插入图片描述
有些CPU可以支持访问任意地址,是因为做了一些处理,但是这样会降低效率。为保证程序的高效运行,编译器会把数据放在合适的位置并占用合适的长度,这就是内存对齐。每种类型的对齐值,就是它的对齐边界。要求占用的地址,及字节数都是它边界的倍数。

如何确认内存边界

在这里插入图片描述
32位系统上指针大小和寄存器大小都是4字节,64位系统上指针大小和寄存器大小都是8字节。
在这里插入图片描述
数据类型的对齐边界取 数据类型大小和平台最大对齐边界中较小的那个。减少类型,降低性能
为什么不统一用平台最大边界: 会造成地址浪费
为什么不能用大于平台边界:也会造成地址浪费

结构体内存对齐

在这里插入图片描述
取结构题中所有成员的对齐值也就是大小, 再取出最大的,就是结构体的边界值。结构体的内存应该是这个边界值的倍数。 所以结构体大小是24字节。
在这里插入图片描述
如果不扩容到边界值的整数倍,数组内的结构体内存不对齐了。只有每个结构体的内存都是边界值的整数倍,才会内存对齐。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值