C++基本組件之內(nèi)存池詳解
內(nèi)存池概念
1:盡量減少malloc的次數(shù)
2:頻繁申請小塊內(nèi)存空間都造成空間的極大浪費(fèi)
3:利用new和delete運(yùn)算符重載,替代系統(tǒng)調(diào)用
4:減少malloc的次數(shù),可在一定程度上提高效率
5:用malloc申請一個(gè)大塊內(nèi)存,從一大塊內(nèi)存中,一點(diǎn)點(diǎn)分配給用戶
6:當(dāng)一大塊快用光了,再申請一大塊
#include <iostream> #include <malloc.h> #include <time.h> using namespace std; namespace _nm1 { //內(nèi)存池 //減少malloc的次數(shù),減少對內(nèi)存的浪費(fèi) //尤其是頻繁地申請小塊內(nèi)存 //速度和效率的提升并不是特別明顯,因?yàn)閙alloc的速度也不慢 //用malloc申請 //一個(gè)大塊內(nèi)存,從一大塊內(nèi)存中,一點(diǎn)點(diǎn)分配給用戶 //當(dāng)一大塊快用光了,再申請一大塊 class A { public: static void *operator new(size_t size); //靜態(tài)成員函數(shù),屬于類,不屬于對象 static void operator delete(void *phead); static int m_iCout;//分配計(jì)數(shù)統(tǒng)計(jì) static int m_iMallocCount;//malloc次數(shù)統(tǒng)計(jì) private: A *next;//指針域,指向下一個(gè)空間 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) { //核心實(shí)現(xiàn)代碼 A* templink; if (m_FreePosi == nullptr) { //待分配內(nèi)存為空時(shí) 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) { //鏈到最后一個(gè)節(jié)點(diǎn)空間,結(jié)束 templink->next = templink + 1; } templink->next = nullptr; ++m_iMallocCount;//統(tǒng)計(jì)次數(shù) } templink = m_FreePosi; m_FreePosi = m_FreePosi->next; //既然已經(jīng)將templink成功返回回去了,就指向下一個(gè)能用的內(nèi)存塊 ++m_iCout; return templink;//返回能有的下一塊內(nèi)存 } void A::operator delete(void * phead) { (static_cast<A*>(phead)->next) = m_FreePosi; //將當(dāng)前要釋放的節(jié)點(diǎn)指針,指向我下一個(gè)空閑塊 m_FreePosi = static_cast<A*>(phead);//始終指向下一個(gè)能分配的內(nèi)存塊 //將m_FreePosi可用空閑塊的指針,直接指向了當(dāng)前要釋放的節(jié)點(diǎn) //意味著后面來申請了,可以直接將這塊空間覆蓋 //前面Phead->next已經(jīng)指向了下一個(gè)空閑塊,所以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)存池所用時(shí)間 } 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所用時(shí)間 } } int main() { //_nm::func(); _nm1::func(); _nm1::func1(); getchar(); }
到此這篇關(guān)于C++基本組件之內(nèi)存池詳解的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中內(nèi)存池的簡單原理及實(shí)現(xiàn)詳解
- C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解
- C++高并發(fā)內(nèi)存池的實(shí)現(xiàn)
- C++設(shè)計(jì)一個(gè)簡單內(nèi)存池的全過程
- C++如何實(shí)現(xiàn)定長內(nèi)存池詳解
- C++內(nèi)存池兩種方案解析
- C++手寫內(nèi)存池的案例詳解
- C++內(nèi)存池的簡單實(shí)現(xiàn)
- C++高并發(fā)內(nèi)存池的整體設(shè)計(jì)和實(shí)現(xiàn)思路
- C++高效內(nèi)存池實(shí)現(xiàn)減少動態(tài)分配開銷的解決方案
相關(guān)文章
C++深度優(yōu)先搜索的實(shí)現(xiàn)方法
這篇文章主要介紹了C++深度優(yōu)先搜索的實(shí)現(xiàn)方法,是數(shù)據(jù)結(jié)構(gòu)中非常重要的一種算法,需要的朋友可以參考下2014-08-08C語言用函數(shù)指針實(shí)現(xiàn)一個(gè)特別的計(jì)算器
函數(shù)指針是一個(gè)指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語言用函數(shù)指針實(shí)現(xiàn)計(jì)算器的方法,需要的朋友可以參考下2022-07-07C++ deque與vector對比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢與劣勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程
這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程,本文詳細(xì)講解了DLL庫的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下2014-09-09C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解
這篇文章主要給大家介紹了關(guān)于C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05