1.golang内存对齐保证
type | align 保证 |
---|---|
bool,type,uint8,int8 | 1个字节 |
uint16,int16 | 2个字节 |
uint32,int32 | 4个字节 |
float32,complex64 | 4个字节 |
arrays | 尤其元素element类型决定 |
structs | 由其字段(field)类型 最大的字段决定,上限是一个机器字大小 |
other types | 一个机器字的大小 |
struct{}, [0]T{} | 0 字节 |
- go在final zero field 中会进行填充一个机器字大小,防止零字节调用到别人的中,举个例子
`
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()
}
结果:
T1 size: 8, T2 size: 16
`
计算机结构中可能会要求内存地址进行对齐;也就是说,一个变量的地址是一个因子的倍数。例如
`
uintptr(unsafe.Pointer(&t1)) % unsafe.Alignof(t1) == 0
恒成立
`
3. 在32系统上保证64位是安全的访问
在golang上,开发者有义务使64位字长的数据原子访问是64位(8字节)对齐的。 在 全局变量,结构体和切片的第一个字长数据可以被认为是64位对齐,如果是嵌套的结构体8字节对齐,那么被嵌套的结构要是8字节对齐,并且放在结构体中的第一个
如果保证呢:
变量或开辟的结构体、数组和切片值中的第一个64位字可以被认为是8字节对齐的。
开辟的意思就是好通过声明,make,new方式创建的。就是说这样创建的64为字可以保证是64为对齐的