allocate
1 | template<typename _Tp> |
图解形式:
首先是64个blocks,每一个对象占用1个block,64个blocks加上bitmap[1]和bitmap[0]再加上use count形成一个super block。即super block = 64block + bitmap[1] + bitmap[0];
use count表示64个block已经用了几个,如果某一个block被使用了,那么bitmap[1]和bitmap[0]相应bit的数字变为0,bitmap[1]和bitmap[0]均为unsigned int,所以两个加起来共有64比特,也就可以表示64个block的使用情况。
在最前面还有一个数字,表示super block的大小,上图中的大小为:4(use count)+4 * 2(bitmap)+648(单个对象大小)=524字节。单个对象的大小只能是8的倍数。
多个super block是通过__mini_vector管理的,__mini_vector是一个vector,但不是标准库的vector,而是自己写的一个vector,但它与标准库中的vector拥有同样的特性——两倍增长。也就是说,如果64个block用光了,下次会分配128个block。
__mini_vector有3个用来管理内存的成员变量。
1 | private: |
当64个block用光时,会再申请128个,然后bitmap变为4个。和vector的成长一样,会申请另一块内存然后将现在的搬过去:
每次都这样成长两倍,2的幂次方级别地成长。
deallocate
1 | template<typename _Tp> |