【发布时间】:2020-05-26 16:06:58
【问题描述】:
当我在 sync.WaitGroup 中研究代码时, 我注意到 WaitGroup 使用 state1([3]uint32) 字段来假设状态原子存储的 64 位对齐指针。
像这样:
// https://github.com/golang/go/issues/19149
type WaitGroup struct {
noCopy noCopy
state1 [3]uint32
}
// state returns pointers to the state and sema fields stored within wg.state1.
func (wg *WaitGroup) state() (statep *uint64, semap *uint32) {
if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 {
return (*uint64)(unsafe.Pointer(&wg.state1)), &wg.state1[2]
} else {
return (*uint64)(unsafe.Pointer(&wg.state1[1])), &wg.state1[0]
}
}
但是当我在 mac 和 linux 上检查这个时, 在 64 位系统上,第一个分配的 4 字节对齐数据结构地址显示在 mod 8 之后是 4,而在 32 位系统上是 0。
我很好奇它在 golang 中是如何保证的?
代码在这里:https://play.golang.org/p/oiZMHd2c0I6
// 32-bit system:
// GOARCH=386 go run main.go
// 0 4 0 //why first address mod 8 is 0
// 64-bit system:
// go run main.go
// 4 0 4 //why first address mod 8 is 4
更新: 使用@Renat 的答案地址,不能保证变量地址。 输出可能不包含。
【问题讨论】:
-
"在 mod 8 为 4 后,在 64 位中显示 4 字节对齐的地址,在 32 位拱门上为 0"。或许你能解释一下这句话?
-
@Volker 抱歉之前的解释很差,我只是改一下。
标签: go 32bit-64bit memory-alignment