轉自: http://blog.csdn.net/060/article/details/1326025
?
?
?
這是我翻譯的文章,來自 Code Project,
原文作者: DanDanger2000 .?
原文鏈接: http://www.codeproject.com/cpp/MemoryPool.asp
C++ 內存池
l ? 下載示例工程 – 105Kb
l ? 下載源代碼 – 17.3Kb
?
malloc
,
new
等
)
的方式快
CMemoryPool
的一小部分,參看由
Doxygen
生成的文檔以得到詳細的類描述。
SMemoryChunk
(
m_ptrFirstChunk
,
m_ptrLastChunk
, and
m_ptrCursorChunk
)
的指針。這些塊
(chunks)
建立一個內存塊
(memory chunks)
的鏈表。各自指向鏈表中的下一個塊
(chunk)
。當從操作系統(tǒng)分配到一塊內存時,它將完全的被
SMemoryChunk
s
管理。讓我們近一點看看一個塊
(chunk)
。
?
?













Data
)
,
DataSize
)
,
UsedSize
)
,
CmemoryPool
的構造函數(shù),內存池
(Memory Pool)
將從操作系統(tǒng)申請它的第一塊
(
大的
)
內存塊
(memory-chunk)


























AllocateMemory
最終完成了從操作系統(tǒng)申請內存。










SMemoryChunk
s
管理所有數(shù)據(jù)。從OS申請完內存之后,我們的塊(chunks)和實際的內存塊(block)之間就不存在聯(lián)系:
SmemoryChunk
的數(shù)組來管理內存塊:










CalculateNeededChunks()
負責計算為管理已經(jīng)得到的內存需要的塊(chunks)的數(shù)量。分配完塊(chunks)之后(通過
malloc
)
,
ptrNewChunks
將指向一個
SmemoryChunk
s
的數(shù)組。注意,數(shù)組里的塊
(chunks)
現(xiàn)在持有的是垃圾數(shù)據(jù),因為我們還沒有給
chunk-members
賦有用的數(shù)據(jù)。內存池的堆
(Memory Pool-"Heap"):
SMemoryChunk
allocation
AllocateMemory()
會照顧它。
LinkChunksToData()
最后將把數(shù)據(jù)塊
(data block)
和
chunks
聯(lián)系起來,并將為每個
chunk-member
賦一個可用的值。





LinkChunksToData()
:


















































m_ptrFirstChunk
現(xiàn)在指向塊數(shù)組(
chunks-array
)
的
第一個
塊,每一個塊嚴格的管理來自內存(
memory block
)
的
m_sMemoryChunkSize
個字節(jié)。一個
”
偏移量
”(offset)
——這個值是可以計算的所以每個
(chunk)
能夠指向內存塊
(
memory block)
的特定部分。



SmemoryChunk
將被追加到鏈表的最后
一個
元素(并且它自己將成為最后一個元素):





DataSize
成員。

























RecalcChunkMemorySize
之后,每個chunk都知道它指向的空閑內存的大小。所以,將很容易確定一個chunk是否能夠持有一塊特定大小的內存:當
DataSize
成員大于
(
或等于
)
已經(jīng)申請的內存大小以及
DataSize
成員是
0
,于是
chunk
有能力持有一塊內存。最后,內存分割完成了。為了不讓事情太抽象,我們假定內存池
(memory pool )
包含600字節(jié),每個chunk持有100字節(jié)。
GetMemory
:


































DataSize
必須大于或等于被申請的內存的大小;
?
UsedSize
必須是
0
。
FindChunkSuitableToHoldMemory
?
方法完成。如果它返回
NULL
,那么在內存池中沒有可用的內存。這將導致
AllocateMemory
的調用
(
上面討論過
)
,它將從
OS
申請更多的內存。如果返回值不是
NULL
,
一個可用的
chunk
被發(fā)現(xiàn)。
SetMemoryChunkValues
會調整
chunk
成員的值,并且最后
Data
指針被返回給用戶
...













GetMemory
?
從第一個chunk返回
Data
指針并把它的
UsedSize
設為300字節(jié),因為300字節(jié)是能夠被管理的內存的最小值并大于等于250。那些剩下的
(300 - 250 = 50)
字節(jié)被稱為內存池的
"
memory overhead
"
。這沒有看起來的那么壞,因為這些內存還可以使用
(
它仍然在內存池里
)
。
FindChunkSuitableToHoldMemory
搜索可用
chunk
時,它僅僅從一個空的
chunk
跳到另一個空的
chunk
。那意味著,如果某個人申請另一塊內存
(memory-chunk)
,第四塊
(
持有
300
字節(jié)的那個
)
會成為下一個可用的
("valid") chunk
。
- CMemoryPool.h
- CMemoryPool.cpp
- IMemoryBlock.h
- SMemoryChunk.h
CmemoryPool
類的實例,你就可以從它里面申請內存。所有的內存池的配置在
CmemoryPool
類的構造函數(shù)
(
使用可選的參數(shù)
)
里完成。看一看頭文件
("
CMemoryPool.h
")
或
Doxygen-doku
。所有的文件都有詳細的
(Doxygen-)
文檔。






WriteMemoryDumpToFile(
strFileName
)
寫一個
"memory dump"
到你的
HDD
。看看一個簡單的測試類的構造函數(shù)
(
使用內存池重載了
new
和
delete
運算符
)
:























MyTestClass
類的所有成員的值。明顯的,
"Hello"
字符串
(
m_cMyArray
)
在那里,以及整型數(shù)
m_iMyInt
(3930 0000 = 0x3039 = 12345 decimal)
等等。這對調式很有用。
timeGetTime()
)
,但是結果說明內存池大大提高了應用程序的速度。所有的測試在
Microsoft Visual Studio .NET 2003
的
debug
模式下
(
測試計算機
:
Intel Pentium IV Processor (32 bit), 1GB RAM, MS Windows XP Professional
).























- Microsoft Visual C++ 6.0
- Microsoft Visual C++ .NET 2003
- MinGW (GCC) 3.4.4 (Windows)
- GCC 4.0.X (Debian GNU Linux)
CalculateNeededChunks
調用能夠通過從新設計某些方法而去掉
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
