菜鸟一枚
我知道 go 语言的 struct 对齐方式是 4 byte 为一个单位的
但我不知道怎么解释下面这个结构体为什么size是24
```go
type MyStruct struct{
x int8
s string
}
```
我用 sizeof 做实验
```go
func main(){
var tmp MyStruct = MyStruct{0,"x"}
fmt.Println(unsafe.Sizeof(tmp))
fmt.Println(unsafe.Sizeof(tmp.x))
fmt.Println(unsafe.Sizeof(tmp.s))
}
```
结果如下
```
24
1
16
```
string 是16(字符串头指针8,字符串长 8),x单独占用 4 byte,这样不应该是 20 吗?
24 怎么来的?
更多评论
楼主 “struct 对齐方式是 4 byte 为一个单位的”这个理解是错误的,不同类型对齐方式不同,MyStruct中,x(int8)对齐align是1,s(string)对齐align是8,go在分配x后(假设地址为0xc000004481),准备放s时,因为s对齐align是8,就不得不向0xc000004488这个地址分配了,可以用以下代码看偏移和变量地址:
***
fmt.Printf("x align:%v offset:%v\n",unsafe.Alignof(tmp.x),unsafe.Offsetof(tmp.x))
***
fmt.Printf("s align:%v offset:%v\n",unsafe.Alignof(tmp.s),unsafe.Offsetof(tmp.s))
***
fmt.Printf("%p\n",&tmp.x)
***
fmt.Printf("%p\n",&tmp.s)
***
输出:
x align:1 offset:0
s align:8 offset:8
0xc000004480
0xc000004488
#1