美文网首页
golang内存对齐

golang内存对齐

作者: shuaidong | 来源:发表于2021-11-05 18:08 被阅读0次

    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为对齐的

    相关文章

      网友评论

          本文标题:golang内存对齐

          本文链接:https://www.haomeiwen.com/subject/nsbrzltx.html