1.golang內(nèi)存對(duì)齊保證
type | align 保證 |
---|---|
bool,type,uint8,int8 | 1個(gè)字節(jié) |
uint16,int16 | 2個(gè)字節(jié) |
uint32,int32 | 4個(gè)字節(jié) |
float32,complex64 | 4個(gè)字節(jié) |
arrays | 尤其元素element類型決定 |
structs | 由其字段(field)類型 最大的字段決定粒梦,上限是一個(gè)機(jī)器字大小 |
other types | 一個(gè)機(jī)器字的大小 |
struct{}, [0]T{} | 0 字節(jié) |
- go在final zero field 中會(huì)進(jìn)行填充一個(gè)機(jī)器字大小,防止零字節(jié)調(diào)用到別人的中,舉個(gè)例子
`
type T1 struct {
a struct{}
x int64
}
type T2 struct {
x int64
a struct{}
}
func main() {
a1 := T1{}
a2 := T2{}
fmt.Printf("T1 size: %d, T2 size: %d\n",unsafe.Sizeof(a1), unsafe.Sizeof(a2) )
SvcRun()
}
結(jié)果:
T1 size: 8, T2 size: 16
`
計(jì)算機(jī)結(jié)構(gòu)中可能會(huì)要求內(nèi)存地址進(jìn)行對(duì)齊;也就是說(shuō),一個(gè)變量的地址是一個(gè)因子的倍數(shù)。例如
`
uintptr(unsafe.Pointer(&t1)) % unsafe.Alignof(t1) == 0
恒成立
`
3. 在32系統(tǒng)上保證64位是安全的訪問(wèn)
在golang上,開(kāi)發(fā)者有義務(wù)使64位字長(zhǎng)的數(shù)據(jù)原子訪問(wèn)是64位(8字節(jié))對(duì)齊的驮审。 在 全局變量,結(jié)構(gòu)體和切片的第一個(gè)字長(zhǎng)數(shù)據(jù)可以被認(rèn)為是64位對(duì)齊,如果是嵌套的結(jié)構(gòu)體8字節(jié)對(duì)齊恨统,那么被嵌套的結(jié)構(gòu)要是8字節(jié)對(duì)齊,并且放在結(jié)構(gòu)體中的第一個(gè)
如果保證呢:
變量或開(kāi)辟的結(jié)構(gòu)體三妈、數(shù)組和切片值中的第一個(gè)64位字可以被認(rèn)為是8字節(jié)對(duì)齊的畜埋。
開(kāi)辟的意思就是好通過(guò)聲明,make,new方式創(chuàng)建的。就是說(shuō)這樣創(chuàng)建的64為字可以保證是64為對(duì)齊的