go语言 内存对齐
我们在学习结构体的时候肯定会遇到一个新的概念,那就是“内存对齐”
官话:为什么要内存对齐
- 平台(移植性)原因:不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况
- 性能原因:若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作
看例子分析
// 写法一
type T1 struct {
a int8
b int64
c int16
}
![](https://img2020.cnblogs.com/blog/1161346/202108/1161346-20210826112703040-510779614.png)
其中绿色是int8占用的空间,红色是补齐的空间,蓝色是 int64占用的空间 黄色是int16占用的空间 红色是补齐空间,总共占用12个字节
分析了很多文章,写的都很绕,在这我们从操作系统的读取习惯来说
它是这样四个四个的读的 并不是一次全读,你如果不把单独的变量放在一段里,他就会读两次(因为放在两个里面了嘛)就像下面的图,这样效率就降低了
![](https://img2020.cnblogs.com/blog/1161346/202108/1161346-20210826113513344-170179683.png)
// 写法二
type T2 struct {
a int8
c int16
b int64
}
内存占用情况:
![](https://img2020.cnblogs.com/blog/1161346/202108/1161346-20210826112931165-59436588.png)
可以看到写法二总共占用8个字节,和一相比 节省了资源,所以以后定义变量的时候尽量按照从小到大的顺序来
自己瞎研究的,要是有不对的地方欢迎指正,评论,谢谢!!!