C++基本組件之內(nèi)存池詳解
內(nèi)存池概念
1:盡量減少malloc的次數(shù)
2:頻繁申請小塊內(nèi)存空間都造成空間的極大浪費
3:利用new和delete運算符重載,替代系統(tǒng)調(diào)用
4:減少malloc的次數(shù),可在一定程度上提高效率
5:用malloc申請一個大塊內(nèi)存,從一大塊內(nèi)存中,一點點分配給用戶
6:當一大塊快用光了,再申請一大塊
#include <iostream>
#include <malloc.h>
#include <time.h>
using namespace std;
namespace _nm1
{
//內(nèi)存池
//減少malloc的次數(shù),減少對內(nèi)存的浪費
//尤其是頻繁地申請小塊內(nèi)存
//速度和效率的提升并不是特別明顯,因為malloc的速度也不慢
//用malloc申請
//一個大塊內(nèi)存,從一大塊內(nèi)存中,一點點分配給用戶
//當一大塊快用光了,再申請一大塊
class A
{
public:
static void *operator new(size_t size);
//靜態(tài)成員函數(shù),屬于類,不屬于對象
static void operator delete(void *phead);
static int m_iCout;//分配計數(shù)統(tǒng)計
static int m_iMallocCount;//malloc次數(shù)統(tǒng)計
private:
A *next;//指針域,指向下一個空間
static A* m_FreePosi;//總是指向一塊分配出去的內(nèi)存首地址
static int m_sTrunkCout;//一次分配多少倍
};
int A::m_iCout = 0;//初始化
int A::m_iMallocCount = 0;
A *A::m_FreePosi = nullptr;
int A::m_sTrunkCout = 5;//一次分配五倍
void * A::operator new(size_t size)
{
//核心實現(xiàn)代碼
A* templink;
if (m_FreePosi == nullptr)
{
//待分配內(nèi)存為空時
size_t realsize = m_sTrunkCout*size;//一次五倍
m_FreePosi = reinterpret_cast<A*>(new char[realsize]);
//一次向系統(tǒng)要5倍的類A字節(jié)數(shù)大小,不是遞歸,系統(tǒng)new
templink = m_FreePosi;
//將分配出來的內(nèi)存,彼此之間鏈表串起來
for (; templink != &m_FreePosi[m_sTrunkCout - 1]; ++templink)
{
//鏈到最后一個節(jié)點空間,結(jié)束
templink->next = templink + 1;
}
templink->next = nullptr;
++m_iMallocCount;//統(tǒng)計次數(shù)
}
templink = m_FreePosi;
m_FreePosi = m_FreePosi->next;
//既然已經(jīng)將templink成功返回回去了,就指向下一個能用的內(nèi)存塊
++m_iCout;
return templink;//返回能有的下一塊內(nèi)存
}
void A::operator delete(void * phead)
{
(static_cast<A*>(phead)->next) = m_FreePosi;
//將當前要釋放的節(jié)點指針,指向我下一個空閑塊
m_FreePosi = static_cast<A*>(phead);//始終指向下一個能分配的內(nèi)存塊
//將m_FreePosi可用空閑塊的指針,直接指向了當前要釋放的節(jié)點
//意味著后面來申請了,可以直接將這塊空間覆蓋
//前面Phead->next已經(jīng)指向了下一個空閑塊,所以m_FreePosi可以直接next到
}
void func()
{
//測試代碼
clock_t start, end;
start = clock();
for (int i = 0; i < 500; i++)
{
A *pa = new A();//重載了new
}
end = clock();
cout << "申請分配內(nèi)存的次數(shù)" << A::m_iMallocCount << endl;
cout << end - start << endl;//測試內(nèi)存池所用時間
}
void func1()
{
//測試代碼
clock_t start, end;
start = clock();
for (int i = 0; i < 5000000; i++)
{
A *pa = ::new A();//重載了new
}
end = clock();
cout << end - start << endl;//測試普通new所用時間
}
}
int main()
{
//_nm::func();
_nm1::func();
_nm1::func1();
getchar();
}



到此這篇關(guān)于C++基本組件之內(nèi)存池詳解的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程
這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程,本文詳細講解了DLL庫的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下2014-09-09
C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解
這篇文章主要給大家介紹了關(guān)于C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05

