欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

【譯】C++ 內(nèi)存池 -- C++ Memory Pool .

系統(tǒng) 2643 0

轉(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

?

目錄
l? 引言
l? 它怎樣工作
l? 示例
l? 使用這些代碼
l? 好處
l? 關(guān)于代碼
l? ToDo
l? 歷史
?
引言
C/C++ 的內(nèi)存分配 ( 通過 malloc new ) 可能需要花費(fèi)很多時(shí)。
更糟糕的是,隨著時(shí)間的流逝,內(nèi)存 (memory) 將形成碎片,所以一個(gè)應(yīng)用程序的運(yùn)行會(huì)越來越慢當(dāng)它運(yùn)行了很長(zhǎng)時(shí)間和 / 或執(zhí)行了很多的內(nèi)存分配 ( 釋放 ) 操作的時(shí)候。特別是,你經(jīng)常申請(qǐng)很小的一塊內(nèi)存,堆 (heap) 會(huì)變成碎片的。
解決方案 : 你自己的內(nèi)存池
一個(gè) ( 可能的 ) 解決方法是內(nèi)存池 (Memory Pool)
在啟動(dòng)的時(shí)候,一個(gè) 內(nèi)存池 ”(Memory Pool) 分配一塊很大的內(nèi)存,并將會(huì)將這個(gè)大塊 (block) 分成較小的塊 (smaller chunks) 。每次你從內(nèi)存池申請(qǐng)內(nèi)存空間時(shí),它會(huì)從先前已經(jīng)分配的塊 (chunks) 中得到, 而不是從操作系統(tǒng)。最大的優(yōu)勢(shì)在于:
l? 非常少 ( 幾沒有 ) 堆碎片
l? 比通常的內(nèi)存申請(qǐng) / 釋放 ( 比如通過 malloc , new ) 的方式快
另外,你可以得到以下好處:
l? 檢查任何一個(gè)指針是否在內(nèi)存池里
l? 寫一個(gè) 堆轉(zhuǎn)儲(chǔ) ( Heap-Dump )” 到你的硬盤 ( 對(duì)事后的調(diào)試非常有用 )
l? 某種 內(nèi)存泄漏檢測(cè) ( memory-leak detection )” :當(dāng)你沒有釋放所有以前分配的內(nèi)存時(shí),內(nèi)存池 (Memory Pool) 會(huì)拋出一個(gè) 斷言 ( assertion ).
它怎樣工作
讓我們看一看內(nèi)存池 (Memory Pool) UML 模式圖:
這個(gè)模式圖只顯示了類 CMemoryPool 的一小部分,參看由 Doxygen 生成的文檔以得到詳細(xì)的類描述。
?
一個(gè)關(guān)于內(nèi)存塊 (MemoryChunks) 的單詞
你應(yīng)該從模式圖中看到, 內(nèi)存池 (Memory Pool) 管理了一個(gè)指向結(jié)構(gòu)體 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)

?

?

typedef? struct ?SMemoryChunk
...
{
??TByte?
* Data?;????????????? // ?The?actual?Data

??std::size_t?DataSize?;???? // ?Size?of?the?"Data"-Block
??std::size_t?UsedSize?;???? // ?actual?used?Size
?? bool ?IsAllocationChunk?;?? // ?true,?when?this?MemoryChunks
????????????????????????????
//
?Points?to?a?"Data"-Block
????????????????????????????
// ?which?can?be?deallocated?via?"free()"

??SMemoryChunk? * Next?;?????? // ?Pointer?to?the?Next?MemoryChunk
????????????????????????????
// ?in?the?List?(may?be?NULL)


}
?SmemoryChunk;
每個(gè)塊(chunk)持有一個(gè)指針,指針指向:
l? 一小塊內(nèi)存 ( Data )
l? 從塊 (chunk) 開始的可用內(nèi)存的總大小 ( DataSize )
l? 實(shí)際使用的大小 ( UsedSize )
l? 以及一個(gè)指向鏈表中下一個(gè)塊 (chunk) 的指針。
第一步:預(yù)申請(qǐng)內(nèi)存 (pre-allocating the memory)
當(dāng)你調(diào)用 CmemoryPool 的構(gòu)造函數(shù),內(nèi)存池 (Memory Pool) 將從操作系統(tǒng)申請(qǐng)它的第一塊 ( 大的 ) 內(nèi)存塊 (memory-chunk)
/**/ /* Constructor
*****************
*/

CMemoryPool::CMemoryPool(
const ?std::size_t? & sInitialMemoryPoolSize,
?????????????????????????
const ?std::size_t? & sMemoryChunkSize,
?????????????????????????
const ?std::size_t? & sMinimalMemorySizeToAllocate,
?????????????????????????
bool ?bSetMemoryData)
... {
??m_ptrFirstChunk??
= ?NULL?;
??m_ptrLastChunk???
= ?NULL?;
??m_ptrCursorChunk?
= ?NULL?;

??m_sTotalMemoryPoolSize?
= ? 0 ?;
??m_sUsedMemoryPoolSize??
= ? 0 ?;
??m_sFreeMemoryPoolSize??
= ? 0 ?;

??m_sMemoryChunkSize???
= ?sMemoryChunkSize?;
??m_uiMemoryChunkCount?
= ? 0 ?;
??m_uiObjectCount??????
= ? 0 ?;

??m_bSetMemoryData???????????????
= ?bSetMemoryData?;
??m_sMinimalMemorySizeToAllocate?
= ?sMinimalMemorySizeToAllocate?;

??
// ?Allocate?the?Initial?amount?of?Memory?from?the?Operating-System...
??AllocateMemory(sInitialMemoryPoolSize)?;
}

類的所有成員通用的初始化在此完成, AllocateMemory 最終完成了從操作系統(tǒng)申請(qǐng)內(nèi)存。
/**/ /* *****************
AllocateMemory
*****************
*/

bool ?CMemoryPool::AllocateMemory( const ?std::size_t? & sMemorySize)
... {
??std::size_t?sBestMemBlockSize?
= ?CalculateBestMemoryBlockSize(sMemorySize)?;
??
// ?allocate?from?Operating?System
??TByte? * ptrNewMemBlock? = ?(TByte? * )?malloc?(sBestMemBlockSize)?;
??...
那么,是如何管理數(shù)據(jù)的呢?
第二步:已分配內(nèi)存的分割 (segmentation of allocated memory)
正如前面提到的, 內(nèi)存池( Memory Pool ) 使用 SMemoryChunk s 管理所有數(shù)據(jù)。從OS申請(qǐng)完內(nèi)存之后,我們的塊(chunks)和實(shí)際的內(nèi)存塊(block)之間就不存在聯(lián)系:
Memory Pool after initial allocation
我們需要分配一個(gè)結(jié)構(gòu)體 SmemoryChunk 的數(shù)組來管理內(nèi)存塊:
?? // ?(AllocateMemory()continued)?:?
??...
??unsigned?
int ?uiNeededChunks? = ?CalculateNeededChunks(sMemorySize)?;
??
// ?allocate?Chunk-Array?to?Manage?the?Memory
??SMemoryChunk? * ptrNewChunks? = ?
????(SMemoryChunk?
* )?malloc?((uiNeededChunks? * ? sizeof (SMemoryChunk)))?;
??assert(((ptrNewMemBlock)?
&& ?(ptrNewChunks))?
???????????????????????????
&& ? " Error?:?System?ran?out?of?Memory " )?;
??...
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"):
Memory Pool after SMemoryChunk allocation
還是那句話,數(shù)據(jù)塊 (data block) chunks 之間沒有聯(lián)系。但是, AllocateMemory() 會(huì)照顧它。 LinkChunksToData() 最后將把數(shù)據(jù)塊 (data block) chunks 聯(lián)系起來,并將為每個(gè) chunk-member 賦一個(gè)可用的值。
// ?(AllocateMemory()continued)?:?
??...
??
// ?Associate?the?allocated?Memory-Block?with?the?Linked-List?of?MemoryChunks
?? return ?LinkChunksToData(ptrNewChunks,?uiNeededChunks,?ptrNewMemBlock)?;
讓我們看看 LinkChunksToData()
/**/ /* *****************
LinkChunksToData
*****************
*/

bool ?CMemoryPool::LinkChunksToData(SMemoryChunk? * ptrNewChunks,?
?????unsigned?
int ?uiChunkCount,?TByte? * ptrNewMemBlock)
... {
??SMemoryChunk?
* ptrNewChunk? = ?NULL?;
??unsigned?
int ?uiMemOffSet? = ? 0 ?;
??
bool ?bAllocationChunkAssigned? = ? false ?;
??
for (unsigned? int ?i? = ? 0 ;?i? < ?uiChunkCount;?i ++ )
??
... {
????
if ( ! m_ptrFirstChunk)
????
... {
??????m_ptrFirstChunk?
= ?SetChunkDefaults( & (ptrNewChunks[ 0 ]))?;
??????m_ptrLastChunk?
= ?m_ptrFirstChunk?;
??????m_ptrCursorChunk?
= ?m_ptrFirstChunk?;
????}

????
else
????
... {
??????ptrNewChunk?
= ?SetChunkDefaults( & (ptrNewChunks[i]))?;
??????m_ptrLastChunk
-> Next? = ?ptrNewChunk?;
??????m_ptrLastChunk?
= ?ptrNewChunk?;
????}

????
????uiMemOffSet?
= ?(i? * ?((unsigned? int )?m_sMemoryChunkSize))?;
????m_ptrLastChunk
-> Data? = ? & (ptrNewMemBlock[uiMemOffSet])?;

????
// ?The?first?Chunk?assigned?to?the?new?Memory-Block?will?be?
????
// ?a?"AllocationChunk".?This?means,?this?Chunks?stores?the
????
// ?"original"?Pointer?to?the?MemBlock?and?is?responsible?for
????
// ?"free()"ing?the?Memory?later....
???? if ( ! bAllocationChunkAssigned)
????
... {
??????m_ptrLastChunk
-> IsAllocationChunk? = ? true ?;
??????bAllocationChunkAssigned?
= ? true ?;
????}

??}

??
return ?RecalcChunkMemorySize(m_ptrFirstChunk,?m_uiMemoryChunkCount)?;
}

讓我們一步步地仔細(xì)看看這個(gè)重要的函數(shù):第一行檢查鏈表里是否已經(jīng)有可用的塊(chunks):
??...
??
if ( ! m_ptrFirstChunk)
??...
我們第一次給類的成員賦值:
??...
??m_ptrFirstChunk?
= ?SetChunkDefaults( & (ptrNewChunks[ 0 ]))?;
??m_ptrLastChunk?
= ?m_ptrFirstChunk?;
??m_ptrCursorChunk?
= ?m_ptrFirstChunk?;
??...
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) 的特定部分。
?
??uiMemOffSet? = ?(i? * ?((unsigned? int )?m_sMemoryChunkSize))?;
??m_ptrLastChunk
-> Data? = ? & (ptrNewMemBlock[uiMemOffSet])?;?
另外,每個(gè)新的來自數(shù)組的 SmemoryChunk 將被追加到鏈表的最后 一個(gè) 元素(并且它自己將成為最后一個(gè)元素):
??...
??m_ptrLastChunk
-> Next? = ?ptrNewChunk?;
??m_ptrLastChunk?
= ?ptrNewChunk?;
??...
在接下來的 " for loop " 中,內(nèi)存池 (memory pool) 將連續(xù)的給數(shù)組中的所有塊 (chunks) 賦一個(gè)可用的數(shù)據(jù)。
Memory and chunks linked together, pointing to valid data
最后,我們必須重新計(jì)算每個(gè)塊(chunk)能夠管理的總的內(nèi)存大小。這是一個(gè)費(fèi)時(shí)的,但是在新的內(nèi)存追加到內(nèi)存池時(shí)必須做的一件事。這個(gè)總的大小將被賦值給chunk的 DataSize 成員。
/**/ /* *****************
RecalcChunkMemorySize
*****************
*/

bool ?CMemoryPool::RecalcChunkMemorySize(SMemoryChunk? * ptrChunk,?
??????????????????unsigned?
int ?uiChunkCount)
... {
??unsigned?
int ?uiMemOffSet? = ? 0 ?;
??
for (unsigned? int ?i? = ? 0 ;?i? < ?uiChunkCount;?i ++ )
??
... {
????
if (ptrChunk)
????
... {
??????uiMemOffSet?
= ?(i? * ?((unsigned? int )?m_sMemoryChunkSize))?;
??????ptrChunk
-> DataSize? = ?
????????(((unsigned?
int )?m_sTotalMemoryPoolSize)? - ?uiMemOffSet)?;
??????ptrChunk?
= ?ptrChunk -> Next?;
????}

????
else
????
... {
?????assert(
false ? && ? " Error?:?ptrChunk?==?NULL " )?;
?????
return ? false ?;
????}

??}

??
return ? true ?;
}

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é)。
??
Memory segmentation finished. Each chunk manages exactly 100 bytes
第三步:從內(nèi)存池申請(qǐng)內(nèi)存 (requesting memory from the memory pool)
那么,如果用戶從內(nèi)存池申請(qǐng)內(nèi)存會(huì)發(fā)生什么?最初,內(nèi)存池里的所有數(shù)據(jù)是空閑的可用的:
?
All memory blocks are available
我們看看 GetMemory :
/**/ /* *****************
GetMemory
*****************
*/

void ? * CMemoryPool::GetMemory( const ?std::size_t? & sMemorySize)
... {
??std::size_t?sBestMemBlockSize?
= ?CalculateBestMemoryBlockSize(sMemorySize)?;??
??SMemoryChunk?
* ptrChunk? = ?NULL?;
??
while ( ! ptrChunk)
??
... {
????
// ?Is?a?Chunks?available?to?hold?the?requested?amount?of?Memory??
????ptrChunk? = ?FindChunkSuitableToHoldMemory(sBestMemBlockSize)?;
????
if ?( ! ptrChunk)
????
... {
??????
// ?No?chunk?can?be?found
??????
// ?=>?Memory-Pool?is?to?small.?We?have?to?request?
??????
// ????more?Memory?from?the?Operating-System....
??????sBestMemBlockSize? = ?MaxValue(sBestMemBlockSize,?
????????CalculateBestMemoryBlockSize(m_sMinimalMemorySizeToAllocate))?;
??????AllocateMemory(sBestMemBlockSize)?;
????}

??}


??
// ?Finally,?a?suitable?Chunk?was?found.
??
// ?Adjust?the?Values?of?the?internal?"TotalSize"/"UsedSize"?Members?and?
??
// ?the?Values?of?the?MemoryChunk?itself.
??m_sUsedMemoryPoolSize? += ?sBestMemBlockSize?;
??m_sFreeMemoryPoolSize?
-= ?sBestMemBlockSize?;
??m_uiObjectCount
++ ?;
??SetMemoryChunkValues(ptrChunk,?sBestMemBlockSize)?;

??
// ?eventually,?return?the?Pointer?to?the?User
?? return ?(( void ? * )?ptrChunk -> Data)?;
}

當(dāng)用戶從內(nèi)存池中申請(qǐng)內(nèi)存是,它將從鏈表搜索一個(gè)能夠持有被申請(qǐng)大小的chunk。那意味著:
l? 那個(gè)chunk的 DataSize 必須大于或等于被申請(qǐng)的內(nèi)存的大小; ?
l? 那個(gè)chunk的 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 指針被返回給用戶 ...
/**/ /* *****************
????SetMemoryChunkValues
????*****************
*/

void ?CMemoryPool::SetMemoryChunkValues(SMemoryChunk? * ptrChunk,?
?????
const ?std::size_t? & sMemBlockSize)
... {
??
if (ptrChunk)?
??
... {
????ptrChunk
-> UsedSize? = ?sMemBlockSize?;
??}

??...
????}
?
示例
假設(shè),用戶從內(nèi)存池申請(qǐng) 250 字節(jié):
?
?
Memory in use
如我們所見,每個(gè)內(nèi)存塊(chunk)管理100字節(jié),所以在這里250字節(jié)不是很合適。發(fā)生了什么事?Well, 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)存池里 )
當(dāng) FindChunkSuitableToHoldMemory 搜索可用 chunk 時(shí),它僅僅從一個(gè)空的 chunk 跳到另一個(gè)空的 chunk 。那意味著,如果某個(gè)人申請(qǐng)另一塊內(nèi)存 (memory-chunk) ,第四塊 ( 持有 300 字節(jié)的那個(gè) ) 會(huì)成為下一個(gè)可用的 ("valid") chunk
?
Jump to next valid chunk
使用代碼
使用這些代碼是簡(jiǎn)單的、直截了當(dāng)?shù)模褐恍枰谀愕膽?yīng)用里包含 " CMemoryPool.h " ,并添加幾個(gè)相關(guān)的文件到你的 IDE/Makefile:
  • CMemoryPool.h
  • CMemoryPool.cpp
  • IMemoryBlock.h
  • SMemoryChunk.h
你只要?jiǎng)?chuàng)建一個(gè) CmemoryPool 類的實(shí)例,你就可以從它里面申請(qǐng)內(nèi)存。所有的內(nèi)存池的配置在 CmemoryPool 類的構(gòu)造函數(shù) ( 使用可選的參數(shù) ) 里完成。看一看頭文件 (" CMemoryPool.h ") Doxygen-doku 。所有的文件都有詳細(xì)的 (Doxygen-) 文檔。
應(yīng)用舉例
MemPool::CMemoryPool? * g_ptrMemPool? = ? new ?MemPool::CMemoryPool()?;
char ? * ptrCharArray? = ?( char ? * )?g_ptrMemPool -> GetMemory( 100 )?;
...
g_ptrMemPool
-> FreeMemory(ptrCharArray,? 100 )?;
delete?g_ptrMemPool?;
好處
內(nèi)存轉(zhuǎn)儲(chǔ) (Memory dump)
你可以在任何時(shí)候通過 WriteMemoryDumpToFile( strFileName ) 寫一個(gè) "memory dump" 到你的 HDD 。看看一個(gè)簡(jiǎn)單的測(cè)試類的構(gòu)造函數(shù) ( 使用內(nèi)存池重載了 new delete 運(yùn)算符 )
?
/**/ /* *****************
Constructor
*****************
*/

MyTestClass::MyTestClass()
... {
???m_cMyArray[
0 ]? = ? ' H ' ?;
???m_cMyArray[
1 ]? = ? ' e ' ?;
???m_cMyArray[
2 ]? = ? ' l ' ?;
???m_cMyArray[
3 ]? = ? ' l ' ?;
???m_cMyArray[
4 ]? = ? ' o ' ?;
???m_cMyArray[
5 ]? = ?NULL?;
???m_strMyString?
= ? " This?is?a?small?Test-String " ?;
???m_iMyInt?
= ? 12345 ?;

???m_fFloatValue?
= ? 23456.7890f ?;
???m_fDoubleValue?
= ? 6789.012345 ?;

???Next?
= ? this ?;
}

MyTestClass? * ptrTestClass? = ? new ?MyTestClass?;?
g_ptrMemPool
-> WriteMemoryDumpToFile( " MemoryDump.bin " )?;
看一看內(nèi)存轉(zhuǎn)儲(chǔ)文件 (" MemoryDump.bin "):
如你所見,在內(nèi)存轉(zhuǎn)儲(chǔ)里有 MyTestClass 類的所有成員的值。明顯的, "Hello" 字符串 ( m_cMyArray ) 在那里,以及整型數(shù) m_iMyInt (3930 0000 = 0x3039 = 12345 decimal) 等等。這對(duì)調(diào)式很有用。
速度測(cè)試
我在 Windows 平臺(tái)上做了幾個(gè)非常簡(jiǎn)單的測(cè)試 ( 通過 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 ).
// Array-test?(Memory?Pool):?
for (unsigned? int ?j? = ? 0 ;?j? < ?TestCount;?j ++ )
... {
????????
// ?ArraySize?=?1000
???? char ? * ptrArray? = ?( char ? * )?g_ptrMemPool -> GetMemory(ArraySize)??;
????g_ptrMemPool
-> FreeMemory(ptrArray,?ArraySize)?;
}

??
????
// Array-test?(Heap):
for (unsigned? int ?j? = ? 0 ;?j? < ?TestCount;?j ++ )
... {
????????
// ?ArraySize?=?1000
???? char ? * ptrArray? = ?( char ? * )?malloc(ArraySize)??;
????free(ptrArray)?;
???}

Results for the "array-test
?
??? //Class-Test for MemoryPool and Heap (overloaded new/delete)
? // Class-Test?for?MemoryPool?and?Heap?(overloaded?new/delete)?
for (unsigned? int ?j? = ? 0 ;?j? < ?TestCount;?j ++ )
... {
????MyTestClass?
* ptrTestClass? = ? new ?MyTestClass?;
????delete?ptrTestClass?;
}

?
Results for the "classes-test" (overloaded new / delete operators)
關(guān)于代碼
這些代碼在Windows和Linux平臺(tái)的下列編譯器測(cè)試通過:
  • Microsoft Visual C++ 6.0
  • Microsoft Visual C++ .NET 2003
  • MinGW (GCC) 3.4.4 (Windows)
  • GCC 4.0.X (Debian GNU Linux)
Microsoft Visual C++ 6.0 ( *.dsw , *.dsp ) Microsoft Visual C++ .NET 2003 ( *.sln , *.vcproj ) 的工程文件已經(jīng)包含在下載中。內(nèi)存池僅用于 ANSI/ISO C++, 所以它應(yīng)當(dāng)在任何 OS 上的標(biāo)準(zhǔn)的 C++ 編譯器編譯。在 64 位處理器上應(yīng)當(dāng)沒有問題。
注意 :內(nèi)存池不是線程安全的。
這個(gè)內(nèi)存池還有許多改進(jìn)的地方 ;-) ToDo 列表包括:
l? 對(duì)于大量的內(nèi)存, memory-"overhead" 能夠足夠大。
l? 某些 CalculateNeededChunks 調(diào)用能夠通過從新設(shè)計(jì)某些方法而去掉
l? 更多的穩(wěn)定性測(cè)試 ( 特別是對(duì)于那些長(zhǎng)期運(yùn)行的應(yīng)用程序 )
l? 做到線程安全。

【譯】C++ 內(nèi)存池 -- C++ Memory Pool .


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 免费a视频在线观看 | av天天看| 亚洲综合久久久久久中文字幕 | 久青草影视 | 五月激情久久 | 色午夜在线 | 99re6在线视频精品免费 | 中文字幕精品一区二区三区精品 | 久久福利剧场 | 一区亚洲 | 我爱我色成人网 | 男女视频免费在线观看 | 日本三级韩国三级香港三级 | 波多野结衣在线免费 | 久久中文字幕一区 | 亚洲一区二区三区在线 | 99这里只有精品视频 | 97色伦图片97综合影院 | 91精品国产综合久久久久 | 欧美成人性性 | 在线播放一区 | 欧美在线观看a | 国产三级成人 | 日本不卡不码高清免费 | 日本高清www无色夜在 | 深夜爽爽爽gif福利免费 | 亚洲自拍偷拍色图 | 久久99在线| 国产男女免费完整版视频 | 欧美日韩在线视频观看 | 免费毛片网站 | 欧美第一视频 | 色伊人网 | 性69交片免费看 | 久久久青青草 | 国产亚洲欧美在线 | 国产精品外围在线观看 | 日韩v在线 | 欧美日韩一区二区三区在线观看 | 超碰免费在线观看 | 黄a在线观看 |