golang内存对齐

2021-11-05  本文已影响0人  shuaidong

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 字节
  1. 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为对齐的

上一篇下一篇

猜你喜欢

热点阅读