go 内存对齐
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了go 内存对齐,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1384字,纯文字阅读大概需要2分钟。
内容图文
![go 内存对齐](/upload/InfoBanner/zyjiaocheng/939/86c4d583ff564d6eb3584882529ed4fd.jpg)
go 内存对齐
前言
学过操作系统的人知道,OS为了CPU读取方便会一次性读取一块的单位,这个块的开大小又称为内存访问粒度。
在64位系统中,这个粒度为8,也就是一次性读取8个字节。
unsafe.Sizeof() //返回传入参数的大小
unsafe.Alignof() //返回对齐参数
对齐规则
-
结构体的成员变量,第一个成员变量的偏移量为 0。往后的每个成员变量的对齐值必须为编译器默认对齐长度(
#pragma pack(n)
)或当前成员变量类型的长度(unsafe.Sizeof
),取最小值作为当前类型的对齐值。其偏移量必须为对齐值的整数倍 -
结构体本身,对齐值必须为8的最小整数倍。
结合以上两点,可得知若编译器默认对齐长度(#pragma pack(n)
)超过结构体内成员变量的类型最大长度时,默认对齐长度是没有任何意义的
操作
我们先来看下两个结构体,他们的成员是相同的,但是排列顺序不一样。这些成员的大小加起来都是15字节。
type q1 struct {
a bool //1
b int32 //4
c int8 //1
d int64 //8
e byte //1
}
type q2 struct {
e byte //1
c int8 //1
a bool //1
b int32 //4
d int64 //8
}
现在,我们输出这两个结构体的大小,他们会一样吗?
q1 := q1{}
q2 := q2{}
fmt.Printf("q1 size :%d,align:%d\n",unsafe.Sizeof(q1),unsafe.Alignof(q1))
fmt.Printf("q2 size :%d,align:%d\n",unsafe.Sizeof(q2),unsafe.Alignof(q2))
//output
// q1 size :32,align:8
// q2 size :16,align:8
差异很大,这个差异就是由于内存对齐导致的。接下来,我们来看下这个差异如何构成的。
q1
在内存中的排列如下,-
符号代表因内存对齐而浪费的字节。
a---\bbbb\c---\dddd\dddd\e---\ 共计32个字节
q2
在内存中排列如下:
abc-\bbbb\dddd\dddd\ 共计16字节
内容总结
以上是互联网集市为您收集整理的go 内存对齐全部内容,希望文章能够帮你解决go 内存对齐所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。