这一篇探索cache_t内部结构
用lldb打印出$3为cache_t的内容,我们发现cache_t包含_bucketsAndMaybeMask,_maybeMask,_flags,_occupied,_originalPreoptCache,其中_bucketsAndMaybeMask和_originalPreoptCache是有值的。
结合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之前对内存做了什么