前言
上一篇文章简单的探究了cache_t的结构,我们还有许多相关的东西没有处理,比如是如何缓存的?我们看到的mask是3,那么方法太多的时候怎么办?带着这些疑问我们开始今天的探究。
一、疑问探究
首先我们利用上节课的脱离源码的工程,多声明几个方法并实现,如图:
然后依次增加调用的方法数,如下:
- 1次
_maybeMask是3,_occupied是1;
- 2次
_maybeMask是3,_occupied是2;
- 3次
_maybeMask是7,_occupied是1;(这里有变化了哦!)
- 4次
_maybeMask是7,_occupied是2。
我们看到,在第三次的时候_maybeMask变成了7,意思是指定的缓存桶子数变化了。同时_occupied变成了1,已用的桶子变少了,理论上应该变多,这是为什么呢?接下来我们进行探索。
二、源码分析
继续上一篇的文章,我们来到cache_t中,我们在cache_t的方法中找到了一个insert方法,如图:
这里是对缓存空间的开辟和扩容,下图是插入:
到这里我们的方法缓存插入就结束了,其中包含了开辟、扩容插入。
三、一些疑问和参数
方法的插入看起来没有那么困难,但是我也有许多疑问
1、缓存空使用率
在不满足宏判断的情况下缓存空间的使用达到3/4或者7/8就需要扩容,为什么?
3/4和7/8为最优内存,此时哈希冲突和空间使用率可以达到最优的平衡,超出后容易冲突出现bad_cache。
2、开辟
我们的目的是缓存,在开辟新的缓存空间时为什么没有把旧的缓存插入到新的空间中?
扩容后的空间和扩容前的空间哈希计算的盐不一样了,无法直接插入,与其扩容后就插入,不如等到再次使用时进行插入。
3、参数和方法
源码分析时候没有对所有的参数和方法进行详细得介绍,这里补充。