golang内存对齐
生活随笔
收集整理的这篇文章主要介绍了
golang内存对齐
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
内存对齐的作用
性能问题
一般程序员会认为内存如下图所示,是有一个个的字节组成,而CPU却不是这样看待的。
CPU把内存当作一块一块的,块的大小可以是2、4、8、16字节大小,因此CPU读取内存是一块一块读取的。(块的大小称为内存读取粒度)
假设CPU要读取一个int型4字节大小的数据,分两种情况讨论:
当数据从0字节开始时,CPU只需要读取一次内存即可取到数据。
当数据从1字节开始时,CPU读取数据就变得复杂了,因为数据没有在一个块内存储。这种情况下,CPU先访问内存读取0-3字节数据,在访问内存读取4-7字节数据,然后把0、5、6、7字节的数据去掉,合并1、2、3、4字节数据。这样的操作显然是浪费了很多性能,所以就有了字节对齐,以空间换时间。
内存对齐规则
默认对齐长度:编译器会有一个默认对齐长度,golang 中 64 为系统默认的对齐长度是 8 (这个默认值规则具体不清楚,后面再来补充)
GO类型对齐
package main import ( "fmt" "reflect" ) type Data struct { b byte a int32 x int64 } type Data1 struct { b byte x int64 a int32 } func main() { var d Data t := reflect.TypeOf(d) fmt.Println(t.Size(),t.Align()) var d1 Data t1 := reflect.TypeOf(d1) fmt.Println(t1.Size(),t1.Align()) } ---------- 输出结果: 16 8 24 8上面的内存结构如下所示:
d 的内存结构:
b---|aaaa|xxxx|xxxx d1的内存结构: b---|----|xxxx|xxxx|aaaa|----C 语言对齐规则和 golang 一致,C 语言的默认对齐大小由编译器决定,我们也可以通过以下代码修改默认对齐大小。
pragma pack(2) // 修改默认对齐大小为 2总结
以上是生活随笔为你收集整理的golang内存对齐的全部内容,希望文章能够帮你解决所遇到的问题。