最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解利用C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池

 更新時(shí)間:2021年08月02日 12:49:16   作者:浮云流響  
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長(zhǎng)時(shí)間高效的運(yùn)行,通過(guò)對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下

前言

在編程過(guò)程中,尤其是對(duì)于C語(yǔ)言開發(fā)者,其實(shí)編程就是在使用內(nèi)存,不停地變化內(nèi)存中的數(shù)據(jù)。當(dāng)我們想開辟一片新的內(nèi)存使用時(shí),就會(huì)使用malloc實(shí)現(xiàn)。但是通過(guò)查閱很多資料,發(fā)現(xiàn)頻繁的使用malloc并不是很好的選擇。原因就是如果頻繁的申請(qǐng)、釋放內(nèi)存,操作系統(tǒng)由于內(nèi)存管理算法原因,導(dǎo)致出現(xiàn)內(nèi)存碎片。其實(shí)產(chǎn)生碎片是一件很平常的事情,為何會(huì)這樣,我想主要是內(nèi)存利用率與性能的一個(gè)平衡。如果操作系統(tǒng)很摳門,肯定會(huì)把內(nèi)存分配的邏輯算的很嚴(yán)密,“見縫插針”這四個(gè)字能很到的詮釋內(nèi)存分配策略。正因?yàn)橐娍p插針,經(jīng)過(guò)很長(zhǎng)的使用,內(nèi)存上會(huì)遍布“針眼”,但是由于針眼普遍很小,當(dāng)你再去插一個(gè)較粗的針的時(shí)候,往往很久“插不進(jìn)去”。因?yàn)樾枰袛噙@么多針眼哪個(gè)足夠?qū)捤傻哪懿暹M(jìn)去這根針。

所以,如果我們不那么摳的去實(shí)現(xiàn)內(nèi)存分配,是不是在性能上會(huì)有很大的提高呢?答案絕對(duì)是肯定的,而且隨著硬件技術(shù)的提升,內(nèi)存已經(jīng)不是當(dāng)年的容量,服務(wù)器起步也得是16G吧,32 64也是很常見的。就連現(xiàn)在手機(jī)都有6G內(nèi)存的,實(shí)在令臺(tái)式機(jī)服務(wù)器都汗顏。

在內(nèi)存池的實(shí)現(xiàn)結(jié)尾,會(huì)加入一塊內(nèi)存池使用率監(jiān)測(cè)打印,開發(fā)一種內(nèi)存池,通吃所有的項(xiàng)目場(chǎng)景,顯然是不可取的。說(shuō)一個(gè)比較時(shí)尚的名詞“機(jī)器學(xué)習(xí)”。這塊的目的在于通過(guò)觀測(cè)內(nèi)存池的使用率,從而發(fā)現(xiàn)哪些長(zhǎng)度的內(nèi)存比較受項(xiàng)目的歡迎,需要多設(shè),哪些長(zhǎng)度的內(nèi)存使用較少,需要少設(shè)。哪些長(zhǎng)度的沒有,需要新設(shè)等等。目前這塊是純手動(dòng)的,并不是動(dòng)態(tài)變化的,有些調(diào)優(yōu)的感覺。

內(nèi)存時(shí)原理說(shuō)明

模擬C語(yǔ)言內(nèi)存分配函數(shù)malloc()和free(),我們這里也定義兩個(gè)函數(shù)alloc和afree,進(jìn)而模擬C語(yǔ)言內(nèi)存的分配的實(shí)現(xiàn)。

  • 定義一個(gè)大的字符數(shù)組,模擬一塊內(nèi)存池。
  • 讓alloc對(duì)一個(gè)大的字符數(shù)組allocbuf中的空間進(jìn)行分配,該數(shù)組是alloc和afree兩個(gè)函數(shù)私有的數(shù)組。
  • 由于alloc和afree處理的對(duì)象是指針而不是數(shù)組下標(biāo),因此,其他函數(shù)無(wú)需知道該數(shù)組的名字,這樣可以在alloc和afree處理的對(duì)象是指針而不是數(shù)組下標(biāo),因此,其他函數(shù)無(wú)需知道該數(shù)組的名字。
  • 他可以在調(diào)用malloc函數(shù)或量操作系統(tǒng)申請(qǐng)一個(gè)指向操作系統(tǒng)申請(qǐng)一個(gè)指向無(wú)名存儲(chǔ)塊的指針獲得。
  • allocbuf中的空間使用情況也是我們需要了解,因此用allocp指針指向allocbuf數(shù)組中下一個(gè)空閑單元。當(dāng)調(diào)用alloc申請(qǐng)n個(gè)字符時(shí)空間時(shí),alloc檢查allocbuf中的下一個(gè)空閑單元。當(dāng)調(diào)用alloc申請(qǐng)n個(gè)字符的空間時(shí),alloc檢查allocbuf中有沒由足夠的空閑空間。如果有足夠的空閑空間,則返回空閑塊的當(dāng)前位置,如果空間不夠則返回0.

下面是簡(jiǎn)易內(nèi)存池的實(shí)現(xiàn)原理圖:

其實(shí)這個(gè)模型可以幫助我們理解關(guān)于malloc和free函數(shù)的很多東西。

代碼實(shí)現(xiàn)

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

static char allocbuf[ALLOCSIZE];	 /* alloc使用的存儲(chǔ)區(qū) */ 

static char *allocp = allocbuf; 		/* 下一個(gè)空閑位置 */ 

char *alloc(int n) 
{ 
	if(allocbuf + ALLOCSIZE - allocp > n) { 	/* 有足夠的空間 */ 
		allocp += n; 
		return allocp - n; 	/* 分配前的指針P */ 
	} else {			 /* 空間不夠 */ 
			return 0; 
	} 
} 

void afree(char *p)		 /* 釋放p指向的存儲(chǔ)區(qū) */ 
{ 
	if(p >= allocbuf && p < allocbuf + ALLOCSIZE ) 
		allocp = p;
}

總結(jié)

到此這篇關(guān)于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的文章就介紹到這了,更多相關(guān)C語(yǔ)言實(shí)現(xiàn)內(nèi)存池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++代碼改造為UTF-8編碼問(wèn)題的總結(jié)(最新推薦)

    C++代碼改造為UTF-8編碼問(wèn)題的總結(jié)(最新推薦)

    本文總結(jié)了如何將C++程序代碼改造為UTF-8編碼,包括操作系統(tǒng)、編譯器和終端等各方面的設(shè)置,在實(shí)際操作中,可以通過(guò)漸進(jìn)式更新的方式,只在新的代碼項(xiàng)目中使用UTF-8編碼,避免大規(guī)模修改舊代碼,感興趣的朋友一起看看吧
    2025-02-02
  • C語(yǔ)言fillpoly函數(shù)詳解

    C語(yǔ)言fillpoly函數(shù)詳解

    在C語(yǔ)言中,fillpoly函數(shù)的功能是畫一個(gè)多邊形,并且把多邊形填充。填充邊框所定義的多邊形的內(nèi)部。fillpoly 函數(shù)的用法:void far fillpoly(int numpoints, int far *polypoints);。
    2015-10-10
  • 簡(jiǎn)介C++編程中的運(yùn)算符重載

    簡(jiǎn)介C++編程中的運(yùn)算符重載

    這篇文章簡(jiǎn)單介紹了C++編程中的運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 聊一聊C++虛函數(shù)表的問(wèn)題

    聊一聊C++虛函數(shù)表的問(wèn)題

    C++是面向?qū)ο蟮恼Z(yǔ)言(與C語(yǔ)言主要區(qū)別),所以C++也擁有多態(tài)的特性。下面通過(guò)代碼看下C++虛函數(shù)表的問(wèn)題,感興趣的朋友一起看看吧
    2021-10-10
  • C/C++可變參數(shù)的使用

    C/C++可變參數(shù)的使用

    可變參數(shù)的使用方法遠(yuǎn)遠(yuǎn)不止以下幾種,不過(guò)在C,C++中使用可變參數(shù)時(shí)要小心,在使用printf()等函數(shù)時(shí)傳入的參數(shù)個(gè)數(shù)一定不能比前面的格式化字符串中的’%’符號(hào)個(gè)數(shù)少,否則會(huì)產(chǎn)生訪問(wèn)越界,運(yùn)氣不好的話還會(huì)導(dǎo)致程序崩潰
    2013-09-09
  • C++ const限定符以及頂層const和底層const的案例詳解

    C++ const限定符以及頂層const和底層const的案例詳解

    這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++ Boost Intrusive庫(kù)示例精講

    C++ Boost Intrusive庫(kù)示例精講

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例

    C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例

    今天小編就為大家分享一篇關(guān)于C++中運(yùn)算符重載的規(guī)則語(yǔ)法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例

    詳解c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例

    這篇文章主要為大家介紹了c/c++鏈?zhǔn)蕉褩C枋鲞M(jìn)制轉(zhuǎn)換問(wèn)題示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論

文化| 万宁市| 阳信县| 南华县| 孝感市| 长岛县| 龙州县| 赤壁市| 饶河县| 佛学| 东城区| 垫江县| 红安县| 定陶县| 织金县| 铜山县| 南郑县| 濮阳市| 星座| 阆中市| 广昌县| 苗栗市| 宾川县| 湛江市| 三江| 新乡县| 广河县| 巴东县| 萨嘎县| 伊川县| 理塘县| 娱乐| 奉化市| 阿勒泰市| 尼木县| 克东县| 治县。| 巴楚县| 佳木斯市| 裕民县| 吉水县|