Go语言需要内存对齐吗?

分类:编程技术 时间:2024-02-20 15:31 浏览:0 评论:0
0
本文主要讲解《Go语言中内存对齐有必要吗?》必要的内存对齐”!

有些同学可能不知道,根据struct中字段的顺序不同,内存占用可能会有很大差异。例如:

type T1 struct { a int8 b int64 c int16 } type T2 struct { a int8 c int16 b int64 }

在64位平台上,T1占用24字节,T2占用16字节;在32位平台上,T1占用16字节bytes,T2占用12个字节。可见,不同的字段顺序最终决定了struct的内存大小,所以有时候合理的字段顺序可以减少内存开销

为什么是这样吗?因为内存对齐的存在以及使用内存对齐的编译器,最终的大小结果会有所不同。至于为什么需要对齐,主要考虑以下两个原因:

平台(可移植性) )

并不是所有的硬件平台都可以访问任何地址的任何数据。例如:spe特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况

性能

如果访问未对齐的内存,则会导致CPU执行两次操作。内存访问,以及额外的时钟周期用于处理对齐和操作。对齐内存只需要一次访问就可以完成读取动作,显然效率要高很多,是一种以空间换时间的标准方法

有的朋友可能认为内存读取只是简单的一种字节数组放置。但实际上CPU对内存的读写并不是一个字节。相反,CPU则逐块读取内存。块大小可以是2、4、6、8、16字节等,块大小我们称为内存访问粒度。假设访问粒度为4,那么CPU将以每4个字节的访问粒度来读写内存。

不同的编译器耳鼻喉科平台有自己默认的“对齐因子”。一般来说,常用的x86平台的系数为4; x8664平台的系数是8。需要注意的是,除了这个默认的对齐因子之外,还有针对不同数据类型的对齐因子。数据类型的对齐因子在不同平台上可能不一致。例如,在x8664平台上,int64的对齐因子为8,而在x86平台上,其对齐因子为4。

以上面的T1和T2为例。在x86_64平台上,T1的内存布局为:

T2的内存布局为(int16的对齐系数为2):

仔细看,T1有很多填充,显然占用了大量空间。这就不难理解为什么调整结构体中成员变量的字段顺序可以减小结构体的大小了。就是因为巧妙地减少了padding的存在。使它们更加“紧凑”

其实除了减少内存占用之外,还有一种情况需要手动对齐:x86平台上64位指针的原子操作。强制对齐的原因就是32位平台上的64位原子操作需要8字节对齐,否则程序会panic

感谢您的阅读,以上是《Go语言是否需要内存对齐》的内容,通过文章的学习,相信大家对于Go语言是否需要内存对齐有了一个清晰的认识,对问题有了更深入的认识,具体的用法需要了解通过实践来验证,这里小编将为大家推送更多相关知识点的文章,欢迎关注!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Go语言需要内存对齐吗?

用户评论