中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現簡單的內存池

發布時間:2021-08-02 15:27:25 來源:億速云 閱讀:203 作者:chen 欄目:開發技術

本篇內容主要講解“C語言如何實現簡單的內存池”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言如何實現簡單的內存池”吧!

前言

在編程過程中,尤其是對于C語言開發者,其實編程就是在使用內存,不停地變化內存中的數據。當我們想開辟一片新的內存使用時,就會使用malloc實現。但是通過查閱很多資料,發現頻繁的使用malloc并不是很好的選擇。原因就是如果頻繁的申請、釋放內存,操作系統由于內存管理算法原因,導致出現內存碎片。其實產生碎片是一件很平常的事情,為何會這樣,我想主要是內存利用率與性能的一個平衡。如果操作系統很摳門,肯定會把內存分配的邏輯算的很嚴密,“見縫插針”這四個字能很到的詮釋內存分配策略。正因為見縫插針,經過很長的使用,內存上會遍布“針眼”,但是由于針眼普遍很小,當你再去插一個較粗的針的時候,往往很久“插不進去”。因為需要判斷這么多針眼哪個足夠寬松的能插進去這根針。

所以,如果我們不那么摳的去實現內存分配,是不是在性能上會有很大的提高呢?答案絕對是肯定的,而且隨著硬件技術的提升,內存已經不是當年的容量,服務器起步也得是16G吧,32 64也是很常見的。就連現在手機都有6G內存的,實在令臺式機服務器都汗顏。

在內存池的實現結尾,會加入一塊內存池使用率監測打印,開發一種內存池,通吃所有的項目場景,顯然是不可取的。說一個比較時尚的名詞“機器學習”。這塊的目的在于通過觀測內存池的使用率,從而發現哪些長度的內存比較受項目的歡迎,需要多設,哪些長度的內存使用較少,需要少設。哪些長度的沒有,需要新設等等。目前這塊是純手動的,并不是動態變化的,有些調優的感覺。

內存時原理說明

模擬C語言內存分配函數malloc()和free(),我們這里也定義兩個函數alloc和afree,進而模擬C語言內存的分配的實現。

  • 定義一個大的字符數組,模擬一塊內存池。

  • 讓alloc對一個大的字符數組allocbuf中的空間進行分配,該數組是alloc和afree兩個函數私有的數組。

  • 由于alloc和afree處理的對象是指針而不是數組下標,因此,其他函數無需知道該數組的名字,這樣可以在alloc和afree處理的對象是指針而不是數組下標,因此,其他函數無需知道該數組的名字。

  • 他可以在調用malloc函數或量操作系統申請一個指向操作系統申請一個指向無名存儲塊的指針獲得。

  • allocbuf中的空間使用情況也是我們需要了解,因此用allocp指針指向allocbuf數組中下一個空閑單元。當調用alloc申請n個字符時空間時,alloc檢查allocbuf中的下一個空閑單元。當調用alloc申請n個字符的空間時,alloc檢查allocbuf中有沒由足夠的空閑空間。如果有足夠的空閑空間,則返回空閑塊的當前位置,如果空間不夠則返回0.

下面是簡易內存池的實現原理圖:

C語言如何實現簡單的內存池

其實這個模型可以幫助我們理解關于malloc和free函數的很多東西。

代碼實現

#define ALLOCSIZE 10000		 /* 可用空間的大小*/ 

static char allocbuf[ALLOCSIZE];	 /* alloc使用的存儲區 */ 

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指向的存儲區 */ 
{ 
	if(p >= allocbuf && p < allocbuf + ALLOCSIZE ) 
		allocp = p;
}

到此,相信大家對“C語言如何實現簡單的內存池”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

本溪市| 巨野县| 十堰市| 土默特右旗| 贺兰县| 开平市| 肃宁县| 丽水市| 法库县| 留坝县| 铜山县| 嘉黎县| 通城县| 略阳县| 海兴县| 古田县| 阿克陶县| 怀宁县| 凌云县| 长子县| 凤台县| 东丰县| 莱西市| 武汉市| 黄冈市| 礼泉县| 聊城市| 荃湾区| 英山县| 陇川县| 磴口县| 图木舒克市| 嘉荫县| 精河县| 新平| 富蕴县| 达日县| 沾化县| 墨竹工卡县| 吉林省| 湄潭县|