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













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


























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










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










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





LinkChunksToData()
:


















































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



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





DataSize
成員。

























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


































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













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






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























MyTestClass
類的所有成員的值。明顯的,
"Hello"
字符串
(
m_cMyArray
)
在那里,以及整型數(shù)
m_iMyInt
(3930 0000 = 0x3039 = 12345 decimal)
等等。這對(duì)調(diào)式很有用。
timeGetTime()
)
,但是結(jié)果說明內(nèi)存池大大提高了應(yīng)用程序的速度。所有的測(cè)試在
Microsoft Visual Studio .NET 2003
的
debug
模式下
(
測(cè)試計(jì)算機(jī)
:
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
調(diào)用能夠通過從新設(shè)計(jì)某些方法而去掉
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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