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

C++基本組件之內(nèi)存池詳解

 更新時(shí)間:2023年03月01日 11:20:57   作者:牽著我的豬去看海  
這篇文章主要為大家詳細(xì)介紹了C++中的基本組件——內(nèi)存池的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下

內(nèi)存池概念

1:盡量減少malloc的次數(shù)

2:頻繁申請(qǐng)小塊內(nèi)存空間都造成空間的極大浪費(fèi)

3:利用new和delete運(yùn)算符重載,替代系統(tǒng)調(diào)用

4:減少malloc的次數(shù),可在一定程度上提高效率

5:用malloc申請(qǐng)一個(gè)大塊內(nèi)存,從一大塊內(nèi)存中,一點(diǎn)點(diǎn)分配給用戶

6:當(dāng)一大塊快用光了,再申請(qǐng)一大塊

#include <iostream>
#include <malloc.h>
#include <time.h>
using namespace std;
namespace _nm1
{
	//內(nèi)存池
	//減少malloc的次數(shù),減少對(duì)內(nèi)存的浪費(fèi)
	//尤其是頻繁地申請(qǐng)小塊內(nèi)存
	//速度和效率的提升并不是特別明顯,因?yàn)閙alloc的速度也不慢
	//用malloc申請(qǐng)
	//一個(gè)大塊內(nèi)存,從一大塊內(nèi)存中,一點(diǎn)點(diǎn)分配給用戶
	//當(dāng)一大塊快用光了,再申請(qǐng)一大塊
	class A
	{
	public:
		static void *operator new(size_t size);
		//靜態(tài)成員函數(shù),屬于類(lèi),不屬于對(duì)象
		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倍的類(lèi)A字節(jié)數(shù)大小,不是遞歸,系統(tǒng)new
			templink = m_FreePosi;
			//將分配出來(lái)的內(nèi)存,彼此之間鏈表串起來(lá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)
		//意味著后面來(lái)申請(qǐng)了,可以直接將這塊空間覆蓋
		//前面Phead->next已經(jīng)指向了下一個(gè)空閑塊,所以m_FreePosi可以直接next到
	}
	void func()
	{
		//測(cè)試代碼
		clock_t start, end;
		start = clock();
		for (int i = 0; i < 500; i++)
		{
			A *pa = new A();//重載了new
		}
		end = clock();
		cout << "申請(qǐng)分配內(nèi)存的次數(shù)" << A::m_iMallocCount << endl;
		cout << end - start << endl;//測(cè)試內(nèi)存池所用時(shí)間
	}
	
	void func1()
	{
		//測(cè)試代碼
		clock_t start, end;
		start = clock();
		for (int i = 0; i < 5000000; i++)
		{
			A *pa = ::new A();//重載了new
		}
		end = clock();
		
		cout << end - start << endl;//測(cè)試普通new所用時(shí)間
	}
}
int main()
{
	//_nm::func();
	_nm1::func();
	_nm1::func1();
	getchar();
}

到此這篇關(guān)于C++基本組件之內(nèi)存池詳解的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的線性表

    C語(yǔ)言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中的線性表

    線性表,數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的一種存儲(chǔ)結(jié)構(gòu),專(zhuān)門(mén)用于存儲(chǔ)邏輯關(guān)系為"一對(duì)一"的數(shù)據(jù)。線性表是基于數(shù)據(jù)在實(shí)際物理空間中的存儲(chǔ)狀態(tài),又可細(xì)分為順序表(順序存儲(chǔ)結(jié)構(gòu))和鏈表
    2022-05-05
  • C++ STL入門(mén)教程(1) vector向量容器使用方法

    C++ STL入門(mén)教程(1) vector向量容器使用方法

    這篇文章主要為大家詳細(xì)介紹了C++ STL入門(mén)教程第一篇,vector向量容器使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Qt音視頻開(kāi)發(fā)之利用ffmpeg實(shí)現(xiàn)倍速播放

    Qt音視頻開(kāi)發(fā)之利用ffmpeg實(shí)現(xiàn)倍速播放

    這篇文章主要為大家詳細(xì)介紹了在Qt音視頻開(kāi)發(fā)中如何利用ffmpeg實(shí)現(xiàn)倍速播放功能(半倍速/2倍速/4倍速/8倍速),感興趣的小伙伴可以了解一下
    2022-11-11
  • C++?指針傳遞的作用小結(jié)

    C++?指針傳遞的作用小結(jié)

    本文主要介紹了C++?指針傳遞的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • c++中引用和指針的區(qū)別和聯(lián)系

    c++中引用和指針的區(qū)別和聯(lián)系

    許多人對(duì)于引用和指針的區(qū)別與聯(lián)系很糾結(jié)(包括我在內(nèi)O(∩_∩)O哈哈~),最近看到一篇關(guān)于引用和指針區(qū)別和聯(lián)系的文章,感覺(jué)茅塞頓開(kāi),在這里和大家分享下
    2014-04-04
  • 雙向鏈表插入刪除基本應(yīng)用介紹

    雙向鏈表插入刪除基本應(yīng)用介紹

    本文將詳細(xì)介紹建立雙向鏈表,實(shí)現(xiàn)對(duì)雙向鏈表的插入,刪除操作,需要了解的朋友可以參考下
    2012-11-11
  • C語(yǔ)言中進(jìn)行大小寫(xiě)字母轉(zhuǎn)化的示例代碼

    C語(yǔ)言中進(jìn)行大小寫(xiě)字母轉(zhuǎn)化的示例代碼

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中提供了用于大小寫(xiě)轉(zhuǎn)換的函數(shù),使得這一操作變得簡(jiǎn)單而高效,本文將詳細(xì)介紹如何在C語(yǔ)言中進(jìn)行大小寫(xiě)字母的轉(zhuǎn)換,包括相關(guān)的函數(shù)和示例代碼,需要的朋友可以參考下
    2024-03-03
  • C++實(shí)現(xiàn)批量圖片拼接

    C++實(shí)現(xiàn)批量圖片拼接

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)批量圖片拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Qt QStandardItemModel用法小結(jié)

    Qt QStandardItemModel用法小結(jié)

    QStandardItemModel可用作標(biāo)準(zhǔn)Qt數(shù)據(jù)類(lèi)型的存儲(chǔ)庫(kù),本文主要介紹了Qt QStandardItemModel用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • C++中的位運(yùn)算和位圖bitmap解析

    C++中的位運(yùn)算和位圖bitmap解析

    這篇文章主要介紹了C++中的位運(yùn)算和位圖bitmap,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論