欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

內(nèi)存時原理說明

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

  • 定義一個大的字符數(shù)組,模擬一塊內(nèi)存池。
  • 讓alloc對一個大的字符數(shù)組allocbuf中的空間進行分配,該數(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)存池的實現(xiàn)原理圖:

其實這個模型可以幫助我們理解關(guān)于malloc和free函數(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語言如何實現(xiàn)簡單的內(nèi)存池的文章就介紹到這了,更多相關(guān)C語言實現(xiàn)內(nèi)存池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++11新增的包裝器詳解

    C++11新增的包裝器詳解

    由于函數(shù)調(diào)用可以使用函數(shù)名、函數(shù)指針、函數(shù)對象或有名稱的lambda表達式,可調(diào)用類型太豐富導(dǎo)致模板的效率極低。包裝器用于解決效率低的問題
    2022-08-08
  • 使用VC6.0對C語言程序進行調(diào)試的基本手段分享

    使用VC6.0對C語言程序進行調(diào)試的基本手段分享

    這篇文章主要介紹了用VC6.0開發(fā)c語言程序的時候調(diào)試代碼的一些小技巧,需要的朋友可以參考下
    2013-07-07
  • QT中進程的創(chuàng)建實現(xiàn)

    QT中進程的創(chuàng)建實現(xiàn)

    本文主要介紹了QT中進程的創(chuàng)建實現(xiàn),詳細介紹了創(chuàng)建進程的整個過程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-08-08
  • 淺談c++中的while(cin)問題

    淺談c++中的while(cin)問題

    下面小編就為大家?guī)硪黄獪\談c++中的while(cin)問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 超詳細的cmake入門教程

    超詳細的cmake入門教程

    這篇文章主要介紹了超詳細的cmake入門教程,需要的朋友可以參考下
    2020-02-02
  • C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換

    C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換

    這篇文章主要介紹了C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換的相關(guān)資料,希望通過本文能幫助到大家,讓大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 一篇文章教你自己動手實現(xiàn)C語言庫函數(shù)

    一篇文章教你自己動手實現(xiàn)C語言庫函數(shù)

    這篇文章主要介紹了C語言庫函數(shù)的相關(guān)資料,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • C語言程序設(shè)計譚浩強第五版課后答案(第三章習(xí)題答案)

    C語言程序設(shè)計譚浩強第五版課后答案(第三章習(xí)題答案)

    這篇文章主要介紹了C語言程序設(shè)計譚浩強第五版課后答案(第三章習(xí)題答案),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-04-04
  • 關(guān)于C++虛繼承的內(nèi)存模型問題

    關(guān)于C++虛繼承的內(nèi)存模型問題

    C++虛繼承的內(nèi)存模型是一個老生常談的話題,實現(xiàn)方法主要依賴于編譯器,本文從多個角度通過代碼詳解C++中虛繼承的內(nèi)存模型知識,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • c++中struct和class的區(qū)別小結(jié)

    c++中struct和class的區(qū)別小結(jié)

    在C++中,class和struct都是用于定義自定義數(shù)據(jù)類型的關(guān)鍵字,本文主要介紹了c++中struct和class的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論