您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++基本組件之內存池的概念是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++基本組件之內存池的概念是什么文章都會有所收獲,下面我們一起來看看吧。
內存池概念
1:盡量減少malloc的次數
2:頻繁申請小塊內存空間都造成空間的極大浪費
3:利用new和delete運算符重載,替代系統調用
4:減少malloc的次數,可在一定程度上提高效率
5:用malloc申請一個大塊內存,從一大塊內存中,一點點分配給用戶
6:當一大塊快用光了,再申請一大塊
#include <iostream> #include <malloc.h> #include <time.h> using namespace std; namespace _nm1 { //內存池 //減少malloc的次數,減少對內存的浪費 //尤其是頻繁地申請小塊內存 //速度和效率的提升并不是特別明顯,因為malloc的速度也不慢 //用malloc申請 //一個大塊內存,從一大塊內存中,一點點分配給用戶 //當一大塊快用光了,再申請一大塊 class A { public: static void *operator new(size_t size); //靜態成員函數,屬于類,不屬于對象 static void operator delete(void *phead); static int m_iCout;//分配計數統計 static int m_iMallocCount;//malloc次數統計 private: A *next;//指針域,指向下一個空間 static A* m_FreePosi;//總是指向一塊分配出去的內存首地址 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) { //核心實現代碼 A* templink; if (m_FreePosi == nullptr) { //待分配內存為空時 size_t realsize = m_sTrunkCout*size;//一次五倍 m_FreePosi = reinterpret_cast<A*>(new char[realsize]); //一次向系統要5倍的類A字節數大小,不是遞歸,系統new templink = m_FreePosi; //將分配出來的內存,彼此之間鏈表串起來 for (; templink != &m_FreePosi[m_sTrunkCout - 1]; ++templink) { //鏈到最后一個節點空間,結束 templink->next = templink + 1; } templink->next = nullptr; ++m_iMallocCount;//統計次數 } templink = m_FreePosi; m_FreePosi = m_FreePosi->next; //既然已經將templink成功返回回去了,就指向下一個能用的內存塊 ++m_iCout; return templink;//返回能有的下一塊內存 } void A::operator delete(void * phead) { (static_cast<A*>(phead)->next) = m_FreePosi; //將當前要釋放的節點指針,指向我下一個空閑塊 m_FreePosi = static_cast<A*>(phead);//始終指向下一個能分配的內存塊 //將m_FreePosi可用空閑塊的指針,直接指向了當前要釋放的節點 //意味著后面來申請了,可以直接將這塊空間覆蓋 //前面Phead->next已經指向了下一個空閑塊,所以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 << "申請分配內存的次數" << A::m_iMallocCount << endl; cout << end - start << endl;//測試內存池所用時間 } 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(); }
關于“C++基本組件之內存池的概念是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++基本組件之內存池的概念是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。