go语言对齐内存 go语言gc( 四 )


Part1 内存布局:axxx|bbbb|cxxx|xxxx|dddd|dddd|exxx|xxxx
通过本节的分析,可得知先前的 “推算” 为什么错误?
是因为实际内存管理并非 “一个萝卜一个坑” 的思想 。而是一块一块 。通过空间换时间(效率)的思想来完成这块读取、写入 。另外也需要兼顾不同平台的内存操作情况
在上一小节,可得知根据成员变量的类型不同,其结构体的内存会产生对齐等动作 。那假设字段顺序不同,会不会有什么变化呢?我们一起来试试吧 :-)
输出结果:
通过结果可以惊喜的发现,只是 “简单” 对成员变量的字段顺序进行改变 , 就改变了结构体占用大小
接下来我们一起剖析一下Part2,看看它的内部到底和上一位之间有什么区别 , 才导致了这样的结果?
符合规则 2,不需要额外对齐
Part2 内存布局:ecax|bbbb|dddd|dddd
通过对比Part1和Part2的内存布局,你会发现两者有很大的不同 。如下:
仔细一看 ,  Part1存在许多 Padding 。显然它占据了不少空间,那么 Padding 是怎么出现的呢?
通过本文的介绍,可得知是由于不同类型导致需要进行字节对齐 , 以此保证内存的访问边界
那么也不难理解,为什么 调整结构体内成员变量的字段顺序 就能达到缩小结构体占用大小的疑问了,是因为巧妙地减少了 Padding 的存在 。让它们更 “紧凑” 了 。这一点对于加深 Go 的内存布局印象和大对象的优化非常有帮
Go小技巧(二)— 打开已经关闭的channel有时候我们需要在完全可控的范围内复用channelgo语言对齐内存,但是关闭go语言对齐内存了的channel原生语法并没有提供方法打开go语言对齐内存,所以利用指针再次打开 。
【go语言对齐内存 go语言gc】 channel的结构体在 chan.go 中:
Channel是否关闭取决于 hchan.closed  , 0是打开,1是关闭 。
方法:让指针指向 hchan.closed 直接修改它的值 。
closedOffset为什么是28呢go语言对齐内存?这个涉及到struct对齐问题,Go内存优化(一)— struct对齐
在上面主要用go语言对齐内存了指针定位closed值,直接修改标志位 。为了保证设置closed值的安全性所以在给它设置值的时候使用runtime.lock上锁 。
关于 go:linkname 可以自行百度,在目录下创建一个 *.s 文件可以躲过编译时error: missing function body。
go语言可以做什么1、服务器编程:以前你如果使用C或者C++做的那些事情go语言对齐内存,用Go来做很合适go语言对齐内存,例如处理日志、数据打包、虚拟机处理、文件系统等 。
2、分布式系统、数据库代理器、中间件:例如Etcd 。
3、网络编程:这一块目前应用最广go语言对齐内存,包括Web应用、API应用、下载应用go语言对齐内存,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现go语言对齐内存了 。
4、开发云平台:目前国外很多云平台在采用Go开发 , 我们所熟知的七牛云、华为云等等都有使用Go进行开发并且开源的成型的产品 。
5、区块链:目前有一种说法,技术从业人员把Go语言称作为区块链行业的开发语言 。如果大家学习区块链技术的话 , 就会发现现在有很多很多的区块链的系统和应用都是采用Go进行开发的 , 比如ehtereum是目前知名度最大的公链,再比如fabric是目前最知名的联盟链,两者都有go语言的版本,且go-ehtereum还是以太坊官方推荐的版本 。
自1.0版发布以来,go语言引起了众多开发者的关注,并得到了广泛的应用 。go语言简单、高效、并发的特点吸引了许多传统的语言开发人员 , 其数量也在不断增加 。

推荐阅读