91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++基本組件之內存池的概念是什么

發布時間:2023-03-01 14:17:44 來源:億速云 閱讀:122 作者:iii 欄目:開發技術

這篇文章主要介紹了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++基本組件之內存池的概念是什么

C++基本組件之內存池的概念是什么

C++基本組件之內存池的概念是什么

關于“C++基本組件之內存池的概念是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++基本組件之內存池的概念是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

青海省| 普陀区| 呼伦贝尔市| 宁陕县| 菏泽市| 德格县| 德保县| 兴文县| 师宗县| 仁寿县| 贵港市| 宣恩县| 禹州市| 永清县| 手游| 惠来县| 大余县| 沿河| 河西区| 宝清县| 峡江县| 江阴市| 永康市| 固镇县| 黑山县| 晋城| 沅江市| 宝应县| 海宁市| 姚安县| 琼海市| 芒康县| 丰县| 中江县| 共和县| 南丰县| 哈尔滨市| 阜康市| 枣阳市| 土默特左旗| 抚松县|