1 上次的实现中,有个严重的bug:
就是在T* Chunk<T>::allocate(const size_type num)中为num>1去搜索连续块的循环中,在找到连续区块之后的处理,没有考虑找到的区块就是pFirst所指的区块的情况。
2 把实现改成了把连续区块区分为只能包含一个T的single单元和可以包含">1"个T的linear单元,它们的区分由一个位来标识,当是linear单元时,第一个单元有一份 next,其第二个单元中含有整个liinear快的单元总数unsigned int linearSize, 由于需要把类型标识与next涵在某个类型中,所以next不再是指针,而是下标,此时next的范围在[0, 2^31), 寻址范围为2G,是足够使用了,看这里:
union Block{
unsigned char e[sizeof(T)];
unsigned int linearSize;
struct {
bool s: 1; // bitfield
unsigned int v: 31;
} next;
} data_[MAX];
work summary:
经过对分配单元的简单分类,省去了一部分较费时的线性搜索,引来了较复杂的逻辑判断,接下来的工作就是找出冗余的判断并消减掉,重要的是不断的测试。
改进后的代码在
这里 :)
最近网络阻塞严重,想联系我的朋友们!发邮件到cyberzeister@gmail.com