为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第9天 空接口\空结构体\nil区别+内存对齐

标签:
Go

课程名称深入Go底层原理,重写Redis中间件实战


课程章节4-11,4-12,4-13

课程讲师Moody


课程内容:

※ nil : nil是空,但是不一定是空指针。nil是一种Type类型,

Type must be a pointer, channel, func, interface, map, or slice type

而这个nil所能代指的类型只能是,指针,通道,方法,接口,map,切片

且,nil不一定等于nil,只有nil代指的类型相同时候,才能判为==。比如两个string的nil


※ 空结构体:空结构体也不是nil,是一种特殊的结构体,其指针也不是nil,指针指向一个特殊的位置,zerobase,所有的空结构体的指针是一样的


※空接口:空接口不一定是nil,必须是eface的两个值,同时为nil,空接口才能==nilhttps://img1.sycdn.imooc.com//6321e4d50001f08511020458.jpg

※内存对齐:

    非内存对齐:会影响内存的原子性和效率、

    △对齐系数:可以由 unsafe.Alignof()查询到,意义是:变量内存地址必须被该系数整除

    对于基础类型,其size和对齐系数是一样的

https://img1.sycdn.imooc.com//6321e7830001df4d28851524.jpg

例如上图,bool占一个字节,所以他只要被1整除的地址都能放。

int32占4个字节,所以地址必须得被4整除,可选的是00 04 08 12 这样的地址,但是00已经被bool占用就直接从04开始

※结构体内部对其

https://img1.sycdn.imooc.com//6321e90a0001906d31201658.jpg

由图可得,第一个元素是bool,size 和系数都是1,这样从结构体的地址头部开始。

string的size是16,系数是8,那么取最小值应该是8,那么从08位置开始

c是int16,系数是2,因为结构体内存是顺序分布的,所以c一定在b后面,从018开始

※ 结构体长度填充

如果结构体最后一个元素没有沾满一块内存,那么需要0来补齐,规则是,取结构体最大成员长度和系统字长的最小值,比如64位电脑就是8字节,那么按上图来说,int16只占了最后一块的2位,所以还要填充6个0

可以通过成员顺序来节约内存

※ 结构体中的空结构体

△如果空结构体在中间,地址紧跟随上一个元素的末尾

△空结构体如果在末尾,需要补齐


课程收获:

学习了 各种空的问题,还有内存分配中的内存对其



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
2
获赞与收藏
4

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消