关于 unsafe.Sizeof 的问题

weixin_38076910 2019-09-20 10:13:32
菜鸟一枚

我知道 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 怎么来的?
...全文
57 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38088241 2019-09-20
  • 打赏
  • 举报
回复
楼主 “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
weixin_38089340 2019-09-20
  • 打赏
  • 举报
回复
struct内存分配: https://go.wuhaolin.cn/gopl/ch13/ch13-01.html
weixin_38107492 2019-09-20
  • 打赏
  • 举报
回复
谢谢,我明白了,这和 C 的 struct 对齐方式很像。 我之前是被人误导了,但是因为我用过C和C++,对此感到怀疑,于是自己做了个实验。

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧