go语言 内存对齐

我们在学习结构体的时候肯定会遇到一个新的概念,那就是“内存对齐”

官话:为什么要内存对齐

  • 平台(移植性)原因:不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况
  • 性能原因:若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作

 

看例子分析

// 写法一
type T1 struct {
    a int8
    b int64
    c int16
}
 

 其中绿色是int8占用的空间,红色是补齐的空间,蓝色是  int64占用的空间 黄色是int16占用的空间  红色是补齐空间,总共占用12个字节

分析了很多文章,写的都很绕,在这我们从操作系统的读取习惯来说

它是这样四个四个的读的  并不是一次全读,你如果不把单独的变量放在一段里,他就会读两次(因为放在两个里面了嘛)就像下面的图,这样效率就降低了

 
 
// 写法二
type T2 struct {
    a int8
    c int16
    b int64
}
内存占用情况:

 可以看到写法二总共占用8个字节,和一相比 节省了资源,所以以后定义变量的时候尽量按照从小到大的顺序来

自己瞎研究的,要是有不对的地方欢迎指正,评论,谢谢!!!

原文地址:https://www.cnblogs.com/shuai666/p/15188802.html