OC类的探究分析三:类的内存结构之cache_t内部结构

这一篇探索cache_t内部结构

用lldb打印出$3为cache_t的内容,我们发现cache_t包含_bucketsAndMaybeMask,_maybeMask,_flags,_occupied,_originalPreoptCache,其中_bucketsAndMaybeMask和_originalPreoptCache是有值的。


01

结合cache_t的源码注释可知:

        _bucketsAndMaybeMask: 是buckets_t 的指针

        _maybeMask:是 buckets的掩码                   

由此可知需要找buckets_t相关内容,得到bucket_t里面有sel和imp,有注释可知,运行环境为模拟器的情况下,_sel在前,_imp在后









_bucketsAndMaybeMask    buckets首地址

3/4 负载因子,0.75的空间利用率可以减少哈希冲突


cache是如何进行缓存的呢

insert()里,第一次进入慢速查找,开辟内存。第一次进入capacity为0,那么capacity就赋值4,创建好一个bucket,进行cache_hash()方法确定初始位置,同时newOccupied+1

再次插入走快速方法,newOccupied+1,假如并没有超过内存的3/4,就先继续存着。假如总的小于8,可以允许100%缓存,如果超过8,就扩容2倍。扩容后,旧内存被释放掉,因为旧内存无法更改,而且数组平移非常消耗内存,那么扩容就需要重新开辟一个原来2倍大小的内存空间,再重新插入所调用的方法,所以同一个方法在扩容前后地址不一样

在insert之前对内存做了什么

你可能感兴趣的:(OC类的探究分析三:类的内存结构之cache_t内部结构)