1 上次的實現(xiàn)中,有個嚴(yán)重的bug:
???就是在T* Chunk<T>::allocate(const size_type num)中為num>1去搜索連續(xù)塊的循環(huán)中,在找到連續(xù)區(qū)塊之后的處理,沒有考慮找到的區(qū)塊就是pFirst所指的區(qū)塊的情況。
2 把實現(xiàn)改成了把連續(xù)區(qū)塊區(qū)分為只能包含一個T的single單元和可以包含">1"個T的linear單元,它們的區(qū)分由一個位來標(biāo)識,當(dāng)是linear單元時,第一個單元有一份 next,其第二個單元中含有整個liinear快的單元總數(shù)unsigned int linearSize, 由于需要把類型標(biāo)識與next涵在某個類型中,所以next不再是指針,而是下標(biāo),此時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:?
???經(jīng)過對分配單元的簡單分類,省去了一部分較費時的線性搜索,引來了較復(fù)雜的邏輯判斷,接下來的工作就是找出冗余的判斷并消減掉,重要的是不斷的測試。
改進(jìn)后的代碼在
這里? :)
最近網(wǎng)絡(luò)阻塞嚴(yán)重,想聯(lián)系我的朋友們!發(fā)郵件到cyberzeister@gmail.com