最近在寫多**流方面的東西,發現要頻繁的分配記憶體,如果採用
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原始碼分析 的有關章節更合適一些,這裡我只能用我粗陋的語言描述一下。記憶體池,完全可以從字面上理解為從池子裡申請記憶體,釋放的...