詳解利用C語言如何實(shí)現(xiàn)簡單的內(nèi)存池
前言
在編程過程中,尤其是對于C語言開發(fā)者,其實(shí)編程就是在使用內(nèi)存,不停地變化內(nèi)存中的數(shù)據(jù)。當(dāng)我們想開辟一片新的內(nèi)存使用時,就會使用malloc實(shí)現(xiàn)。但是通過查閱很多資料,發(fā)現(xiàn)頻繁的使用malloc并不是很好的選擇。原因就是如果頻繁的申請、釋放內(nèi)存,操作系統(tǒng)由于內(nèi)存管理算法原因,導(dǎo)致出現(xiàn)內(nèi)存碎片。其實(shí)產(chǎn)生碎片是一件很平常的事情,為何會這樣,我想主要是內(nèi)存利用率與性能的一個平衡。如果操作系統(tǒng)很摳門,肯定會把內(nèi)存分配的邏輯算的很嚴(yán)密,“見縫插針”這四個字能很到的詮釋內(nèi)存分配策略。正因?yàn)橐娍p插針,經(jīng)過很長的使用,內(nèi)存上會遍布“針眼”,但是由于針眼普遍很小,當(dāng)你再去插一個較粗的針的時候,往往很久“插不進(jìn)去”。因?yàn)樾枰袛噙@么多針眼哪個足夠?qū)捤傻哪懿暹M(jìn)去這根針。
所以,如果我們不那么摳的去實(shí)現(xiàn)內(nèi)存分配,是不是在性能上會有很大的提高呢?答案絕對是肯定的,而且隨著硬件技術(shù)的提升,內(nèi)存已經(jīng)不是當(dāng)年的容量,服務(wù)器起步也得是16G吧,32 64也是很常見的。就連現(xiàn)在手機(jī)都有6G內(nèi)存的,實(shí)在令臺式機(jī)服務(wù)器都汗顏。
在內(nèi)存池的實(shí)現(xiàn)結(jié)尾,會加入一塊內(nèi)存池使用率監(jiān)測打印,開發(fā)一種內(nèi)存池,通吃所有的項(xiàng)目場景,顯然是不可取的。說一個比較時尚的名詞“機(jī)器學(xué)習(xí)”。這塊的目的在于通過觀測內(nèi)存池的使用率,從而發(fā)現(xiàn)哪些長度的內(nèi)存比較受項(xiàng)目的歡迎,需要多設(shè),哪些長度的內(nèi)存使用較少,需要少設(shè)。哪些長度的沒有,需要新設(shè)等等。目前這塊是純手動的,并不是動態(tài)變化的,有些調(diào)優(yōu)的感覺。
內(nèi)存時原理說明
模擬C語言內(nèi)存分配函數(shù)malloc()和free(),我們這里也定義兩個函數(shù)alloc和afree,進(jìn)而模擬C語言內(nèi)存的分配的實(shí)現(xiàn)。
- 定義一個大的字符數(shù)組,模擬一塊內(nèi)存池。
- 讓alloc對一個大的字符數(shù)組allocbuf中的空間進(jìn)行分配,該數(shù)組是alloc和afree兩個函數(shù)私有的數(shù)組。
- 由于alloc和afree處理的對象是指針而不是數(shù)組下標(biāo),因此,其他函數(shù)無需知道該數(shù)組的名字,這樣可以在alloc和afree處理的對象是指針而不是數(shù)組下標(biāo),因此,其他函數(shù)無需知道該數(shù)組的名字。
- 他可以在調(diào)用malloc函數(shù)或量操作系統(tǒng)申請一個指向操作系統(tǒng)申請一個指向無名存儲塊的指針獲得。
- allocbuf中的空間使用情況也是我們需要了解,因此用allocp指針指向allocbuf數(shù)組中下一個空閑單元。當(dāng)調(diào)用alloc申請n個字符時空間時,alloc檢查allocbuf中的下一個空閑單元。當(dāng)調(diào)用alloc申請n個字符的空間時,alloc檢查allocbuf中有沒由足夠的空閑空間。如果有足夠的空閑空間,則返回空閑塊的當(dāng)前位置,如果空間不夠則返回0.
下面是簡易內(nèi)存池的實(shí)現(xiàn)原理圖:

其實(shí)這個模型可以幫助我們理解關(guān)于malloc和free函數(shù)的很多東西。
代碼實(shí)現(xiàn)
#define ALLOCSIZE 10000 /* 可用空間的大小*/
static char allocbuf[ALLOCSIZE]; /* alloc使用的存儲區(qū) */
static char *allocp = allocbuf; /* 下一個空閑位置 */
char *alloc(int n)
{
if(allocbuf + ALLOCSIZE - allocp > n) { /* 有足夠的空間 */
allocp += n;
return allocp - n; /* 分配前的指針P */
} else { /* 空間不夠 */
return 0;
}
}
void afree(char *p) /* 釋放p指向的存儲區(qū) */
{
if(p >= allocbuf && p < allocbuf + ALLOCSIZE )
allocp = p;
}
總結(jié)
到此這篇關(guān)于C語言如何實(shí)現(xiàn)簡單的內(nèi)存池的文章就介紹到這了,更多相關(guān)C語言實(shí)現(xiàn)內(nèi)存池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++代碼改造為UTF-8編碼問題的總結(jié)(最新推薦)
本文總結(jié)了如何將C++程序代碼改造為UTF-8編碼,包括操作系統(tǒng)、編譯器和終端等各方面的設(shè)置,在實(shí)際操作中,可以通過漸進(jìn)式更新的方式,只在新的代碼項(xiàng)目中使用UTF-8編碼,避免大規(guī)模修改舊代碼,感興趣的朋友一起看看吧2025-02-02
C++ const限定符以及頂層const和底層const的案例詳解
這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
C++中運(yùn)算符重載的規(guī)則語法實(shí)例
今天小編就為大家分享一篇關(guān)于C++中運(yùn)算符重載的規(guī)則語法實(shí)例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問題示例
這篇文章主要為大家介紹了c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問題示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07

