Go语言源码分析之unsafe (2)

在 Go 中可以调用 unsafe.Alignof 来返回相应类型的对齐系数。通过观察输出结果,可得知基本都是 2n,最大也不会超过 8。这是因为我们的64位编译器默认对齐系数是 8,因此最大值不会超过这个数。

对齐规则

结构体的成员变量,第一个成员变量的偏移量为 0。往后的每个成员变量的对齐值必须为编译器默认对齐长度(#pragma pack(n))或当前成员变量类型的长度(unsafe.Sizeof),取最小值作为当前类型的对齐值。其偏移量必须为对齐值的整数倍

结构体本身,对齐值必须为编译器默认对齐长度结构体的所有成员变量类型中的最大长度取最大数的最小整数倍作为对齐值

结合以上两点,可得知若编译器默认对齐长度超过结构体内成员变量的类型最大长度时,默认对齐长度是没有任何意义的

结构体的对齐值

下面来看一下结构体的对齐:

type part struct { a bool // 1 b int32 //4 c int8 // 1 d int64 // 8 e byte // 1 } func main() { var p part fmt.Println(unsafe.Sizeof(p)) // 32 }

按照普通字段(结构体内成员变量)的对齐方式,我们可以计算得出,这个结构体的大小占1+4+1+8+1=15个字节,但是用unsafe.Sizeof计算发现part结构体占32字节,是不是有点惊讶

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxfd.html