第一步 a的偏移量是0 本身的对齐字节数是1 内存对应 0
b本身的对齐字节数是4 所以地址必须是4的倍数 从4开始 0XXX4567 偏移量是4
c本身的字节对齐是2 所以内存地址是2的倍数 8刚好是2的倍数 从8开始 0XXX456789 偏移量是8
第二步 结构体自身的对齐 最大的数据是 int 4位所以结构体按4对齐 结构体的大小必须是4的倍数
在0XXX456789后添加2位 0XXX456789XX=12个字节
type Stu struct{
a byte
b int32
c int16
}
s:=Stu{5,10,4}
fmt.Println("结构体的大小是",unsafe.Sizeof(s))
ptr0:=unsafe.Pointer(&s)
fmt.Println("第一个偏移量",ptr0)
ptr1:=(*int32)(unsafe.Pointer(uintptr(ptr0)+4))
*ptr1=1000
fmt.Println(s.b)
ptr2:=(*int16)(unsafe.Pointer(uintptr(ptr0)+8))
*ptr2=222
fmt.Println(s.c)
fmt.Printf("a adress is %p\n",&s.a)
fmt.Printf("b adress is %p\n",&s.b)
fmt.Printf("c adress is %p\n",&s.c)
//打印的结果和计算的一样
//但是这个结构体的大小为什么是24
type class struct {
fff byte //1
className string //16
}
c:=class{
className:"111",
fff:1,
}
fmt.Println(unsafe.Sizeof(c.className))
fmt.Println(unsafe.Sizeof(c.fff))
fmt.Println(unsafe.Sizeof(c)) //24
按照对齐的规则 不是大小应该是 32吗
有疑问加站长微信联系(非本文作者)