任意大小分配的記憶體池實現

2021-03-31 08:56:30 字數 989 閱讀 4337

最近在寫多**流方面的東西,發現要頻繁的分配記憶體,如果採用

new來分配速度會很慢,於是自己做了乙個記憶體池。但是如果要開發任意大小分配的記憶體池是非常困難的,而且不能保證有

new的速度快,在網上看到的記憶體池一般都是固定大小分配的。雖然任意大小分配的記憶體池很難實現,但是在某些特殊條件下,就變的很容易了。比如:如果記憶體釋放的順序是按分配的順序釋放的,這種情況在使用佇列來儲存大量資料的情況下非常有用。

實現這種記憶體池只需要一段較大的緩衝區和兩個指標,乙個標示已分配空間頭的位置,乙個表示已分配空間尾部位置。如果記憶體池沒有足夠的空間就退化為使用

new來分配。

分配實現: /*

*@func:alloc

*@brief:

分配nsize

大小的空間

*@param: [in]ulong nsize

要分配的空間大小

*@ret:pvoid

分配的空間的起始位址 */

pvoid crandommempool::alloc(ulong nsize)

else if (m_nheader >= nsize)

}else if (m_ntail < m_nheader)

}

if (***r == null)

else

return ***r;

}

釋放實現: /*

*@func:free

*@brief:

釋放空間,必須指定記憶體空間大小

*@param: [in]pvoid ***r

記憶體空間

*[in]ulong usize

記憶體空間大小

*@ret:void

*/

void crandommempool::free(pvoid ***r, ulong nsize)

else

}

c c 記憶體分配大小

測試平台 linux 32位系統 用sizeof 運算子計算分配空間大小。單位 位元組 1.陣列名與變數名的區別 int main 結果 q 6 mq 4 p 4 分析 q是陣列名,申請記憶體是編譯器記住了,但是賦值給mq後,mq和p一樣是乙個普通的指標了,大小為4.總之 c c 沒有辦法知道指標所...

記憶體池 簡單的記憶體池的實現

當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...

記憶體池實現

記憶體池實現 話說一直想找乙個別人寫好的使用,可惜沒什麼人會拿這小東西發布,只好自寫乙個。1.多級鍊錶分配池 我不知道這種設計的具體學名是什麼,這部分的內容也許你去看 stl原始碼分析 的有關章節更合適一些,這裡我只能用我粗陋的語言描述一下。記憶體池,完全可以從字面上理解為從池子裡申請記憶體,釋放的...