【发布时间】:2018-07-26 13:54:24
【问题描述】:
我最近遇到了http://golang-sizeof.tips/,它解释了如何为结构分配内存。我知道为了确保连续的内存分配,我们在为没有填充将不会获得连续内存的变量分配内存时添加填充。因此,我在我的 64 位计算机上测试了各种组合,发现网站上的结果与我的计算机上的结果不匹配。这是针对这种情况的:
type S2 struct {
a string
b bool
e bool
d int32
f bool
c string
}
主要是,下面的代码给了我48作为变量的大小。
y := S2{"q", true, true,2,true,"w"}
fmt.Println(unsafe.Sizeof(y))
但这与http://golang-sizeof.tips/?t=blahblah 的设想不同。为什么会观察到这种行为? (我希望这不是我的电脑本身的问题)。
编辑:从逻辑上讲,字段 d 和 f 之间不需要填充
为了确定,我还运行了以下代码。
fmt.Println(unsafe.Offsetof(y.a))
fmt.Println(unsafe.Offsetof(y.b))
fmt.Println(unsafe.Offsetof(y.e))
fmt.Println(unsafe.Offsetof(y.d))
fmt.Println(unsafe.Offsetof(y.f))
fmt.Println(unsafe.Offsetof(y.c))
结果:
0
16
17
20
24
32
play.golang.org 使用的是 32 位机器,所以我怀疑是否可以在那里复制!
【问题讨论】:
-
那个网站是错误的。不知道为什么你会质疑一些非官方网站的实际实施。
-
你得问问那个网站的运营者为什么错了。
-
但从逻辑上讲,在字段
d和f之间进行填充是没有意义的 -
@NannanAV:为什么没有意义?
int32的对齐保证是 4,所以它不能从第 18 个字节开始。 -
字节 16 到 23 在 64 位机器上是连续的,因此可以!