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