go 结构体内存对齐

我的博客搬家啦~欢迎光临~ 月一orange - 博客园    今天没吃橘子

对齐规则

1、对于结构体成员变量:

某个成员的偏移量 = k * min(编译器对齐系数, 该成员类型长度) k >= 1

2、结构体完整大小也必须满足:

min(k * max(编译器对齐系数, 最大成员类型长度)) k >= 1

编译器默认对齐长度和计算机一次处理的的位数有关,32位处理器对齐系数为4,64位对齐系数为8。对齐系数就是编译器默认的对齐长度。

demo

对于这样一个结构体:

type Part1 struct {
	a bool
	b int32
	c int8
	d int64
	e byte
}

var p Part1
fmt.Printf("%v\n", unsafe.Sizeof(p) // 32

成员变量对齐方式为:

  1. min(8, 1) = 1,由于是第一个成员,偏移量为0即可,此时内存占位为:a
  2. min(8, 4) = 4,偏移量为4即可,此时内存占位为:axxx | bbbb
  3. min(8, 1) = 1,偏移量为8即可,此时内存占位为:axxx | bbbb | c
  4. min(8, 8) = 8,内存已经占有9位,大于9且是8的整数倍只有16,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd
  5. min(8, 1) = 1,直接加入后一个位置,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | e

结构体整体对齐:

此时结构体占有25个字节,并且max(8, 8) = 8,那么必须要扩展成32个字节才满足对齐要求,故最终内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | exxx | xxxx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值