golang内存对齐

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 欢迎关注微信公众号:全栈工厂 1. 先看一个问题 请思考30秒想想以下代码输出的内容是多少? 执行后代码输出: 你...
    liqingbiubiu阅读 251评论 0 0
  • 先看一个结构体 对于这两个结构体,都有a、b、c三个定义完全一样的字段,只是在定义结构体的时候字段顺序不一样而已,...
    cfanbo阅读 95评论 0 0
  • 如何得到一个对象所占内存大小? 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。...
    郭老汉阅读 1,979评论 2 4
  • 什么是内存对齐 此时的 打印值为:16,一个64长度int占8字节,两个就是16。 此时的 打印值为:16,4+8...
    Stevennnmmm阅读 511评论 0 0
  • 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...
    青石电影阅读 10,367评论 1 2