~~
內(nèi)存池實現(xiàn)有許多種,各有不同的優(yōu)缺點。
這里不是主要說內(nèi)存池,只是覺得這個內(nèi)存池中的指針用得很飄逸!
簡單提示一下: unsigned char** next = (unsigned char**)mStartPotinter;
mStartPotinter作為二維指針的時候,相當(dāng)于是一系列的unsigned char* [].
對于第一個 *next 相當(dāng)于(unsigned char*)mStartPointer[0].
第二個相當(dāng)于(unsigned char*)mStartPointer[sizeof(T)*1];
第三個相當(dāng)于(unsigned char*)mStartPointer[sizeof(T)*2];
所以,構(gòu)造BLOCK之間關(guān)系的時候,也可以寫成
不想多解釋了,累。估計多看幾分種啥都明白了!
posted on 2010-05-03 18:33 麒麟子 閱讀(1957) 評論(11) 編輯 收藏 引用 所屬分類: Programming
這個使用非常的正常, 基本上內(nèi)存池都是這樣的結(jié)構(gòu)。或者為了可讀性使用一個 類似下面的union 。union BLOCK{ BLOCK* next; unsigned char data[BLOCKSIZE];};指針的強制類型轉(zhuǎn)換和0字節(jié)的數(shù)組在Win32 API中廣泛使用著 回復(fù) 更多評論
嗯,是的! 謝謝講解! 回復(fù) 更多評論
@jmchxy 這樣行么? union BLOCK { unsigned char* next; unsigned char data[BLOCKSIZE]; }; 回復(fù) 更多評論
@小時候可靚了 我個人覺得 union BLOCK { DWORD next; unsigned char data[BLOCKSIZE]; }; 這樣寫都行,只要能把這個指針的地址保存到 data的前4個字節(jié),后面自己做強制轉(zhuǎn)換就好了,不過BLOCK* next這樣的格式是科學(xué)的,用void* 或DWORD來聲明指針,然后用*(T*)這樣的格式去取,就太不和諧了 回復(fù) 更多評論
謝謝講解 回復(fù) 更多評論
@zuhd 嗯,謝謝,我早上腦殘了。哈哈 回復(fù) 更多評論
就是把一整塊內(nèi)存分成多塊,利用未使用位置串聯(lián)下這些塊。很多代碼都會涉及到這種用法。 回復(fù) 更多評論
@Kevin Lynx 嗯,就是這樣的!!! 回復(fù) 更多評論
不知道還有其它方式么!! 回復(fù) 更多評論
很棒,學(xué)習(xí)了。 不過,這對單個block的分配是個很好的解決方案, 但是要是分配多個block呢? 在重載delete操作符的函數(shù)中,是沒有辦法知道要本次要刪除的內(nèi)存 到底有多少個塊,也就沒有辦法維護這些block中的地址表。當(dāng)然, 除非把block數(shù)作為參數(shù)傳進去,但這樣的話,就造成了用戶 的麻煩,用戶在刪除分配給自己的內(nèi)存的時候還必須記得這塊內(nèi)存里 的block的數(shù)目,萬一寫錯了,后果不堪設(shè)想。 回復(fù) 更多評論
我覺得這種方法有一個限制:sizeof(T) >= sizeof(指針)用union那種就沒事了,僅僅是這樣做空間上劃不來而已 回復(fù) 更多評論
Powered by: C++博客 Copyright © 麒麟子