手记

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

课程名称深入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,空接口才能==nil

※内存对齐:

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

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

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

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

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

※结构体内部对其

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

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

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

※ 结构体长度填充

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

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

※ 结构体中的空结构体

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

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


课程收获:

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



0人推荐
随时随地看视频
慕课网APP