课程章节: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
可以通过成员顺序来节约内存
※ 结构体中的空结构体
△如果空结构体在中间,地址紧跟随上一个元素的末尾
△空结构体如果在末尾,需要补齐
课程收获:
学习了 各种空的问题,还有内存分配中的内存对其