最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++詳細(xì)講解內(nèi)存管理工具primitives

 更新時(shí)間:2022年06月28日 09:25:15   作者:溫逗死  
文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下

primitives

分配釋放屬于是否可重載
malloc()free()C不可
newdeleteC++表達(dá)式不可
::operator new()::operator delete()C++函數(shù)
allocator::allocate()allocator::deallocate()C++標(biāo)準(zhǔn)庫(kù)可自由設(shè)計(jì)搭配容器

new 和 delete

C/C++中的new和delete的實(shí)現(xiàn)過(guò)程

operator new():第一個(gè)參數(shù)表示大小,第二個(gè)參數(shù)表示保證這個(gè)函數(shù)不拋出異常。

注意:構(gòu)造函數(shù)不能直接調(diào)用,而析構(gòu)函數(shù)可以直接調(diào)用。

new[] 與 delete[] 要搭配使用,未搭配使用可能會(huì)內(nèi)存泄漏,泄露的是指針?biāo)赶虻牡胤健?/p>

析構(gòu)的時(shí)候次序會(huì)逆反。

對(duì)于 析構(gòu)函數(shù) 沒(méi)有意義,new[] 是否對(duì)應(yīng) delete[] 不重要,但是 當(dāng)析構(gòu)函數(shù)有意義時(shí),必須對(duì)應(yīng)。

placement new

placement new 允許我們將對(duì)象建構(gòu)在一個(gè)已經(jīng)分配的內(nèi)存中。并且沒(méi)有對(duì)應(yīng)的placement delete。

第一部分,本來(lái)是分配內(nèi)存,現(xiàn)在已經(jīng)分配好了,所以直接返回。

重載 operator new

::operator new 和::operator delete 全部可以重載,但是不推薦。類(lèi)中 operator new 也可以重載,實(shí)現(xiàn)所需功能,這是最常用的。

class Foo{
public:
	void *operator new(size_t);
	void operator delete(void*,size_t);
	//....
};

注意,可以寫(xiě)出多個(gè)版本,前提是每一個(gè)版本的聲明都必須有獨(dú)特的參數(shù)列。(第一參數(shù)必須是size_t)只有new所調(diào)用的ctor 拋出異常,才會(huì)調(diào)用這些重載版的 operator delete()。

即使 operator delete() 未能一一對(duì)應(yīng)operator new() 也不會(huì)出現(xiàn)任何報(bào)錯(cuò)。換句話說(shuō):放棄處理構(gòu)造函數(shù)拋出的異常。

per-class allocator

一:

想利用類(lèi)內(nèi)重載operator new去接管內(nèi)存的分配,然后利用內(nèi)存池的觀念【即創(chuàng)建出一大段連續(xù)空間的內(nèi)存,然后將其切割成一小段一小段】,將創(chuàng)建的元素對(duì)象放在內(nèi)存池切分好的各分段小內(nèi)存片中,這樣避免了多次調(diào)用new而造成生成多個(gè)帶有cookie的內(nèi)存空間。通過(guò)內(nèi)存池的觀念,可以生成一大段只帶有兩個(gè)頭尾cookie的內(nèi)存空間,而該一大段內(nèi)存空間又被切分成每一小段的內(nèi)存空間,且其中的每一小段內(nèi)存空間片都可以共享這一整體的cookie信息。

因?yàn)闉榱四軐⒁淮蠖蝺?nèi)存空間切分成一小段一小段,然后通過(guò)單向鏈表的形式串接起來(lái),所以必須多引入一個(gè)Screen* next指針。但這又會(huì)增加class Screen的大小【增加了4字節(jié)】。

二:第一個(gè)占用了一個(gè)指針,浪費(fèi)空間

這個(gè)版本通過(guò)union關(guān)鍵字來(lái)減少使用next而所占耗的內(nèi)存!

注意:上面兩個(gè)版本的operator delete操作都沒(méi)有將內(nèi)存空間回收還回給系統(tǒng),而是仍然存在的。雖然operator delete操作沒(méi)有將這些分配的內(nèi)存空間釋放掉,但其仍在控制中即仍可繼續(xù)重新使用【只不過(guò)freeStore或headOfFreeList此時(shí)又重新跑回整個(gè)一大塊內(nèi)存空間的頭端】,所以不算內(nèi)存泄漏!

三:上面的版本不具有復(fù)用性

將分配特定尺寸區(qū)塊的memory allocator包裝成一個(gè)class allocator,這樣每個(gè)allocator object都是個(gè)分配器,體內(nèi)維護(hù)一個(gè)free lists,不同類(lèi)(如下面的class Foo,class Goo等) 里面調(diào)用生成的各自allocator objects維護(hù)不同的free lists。

由上知,class Foo或class Goo其operator new或operator delete最終調(diào)用的都是allocator object所維護(hù)的free list而進(jìn)行操作的!

另外,class Foo或class Goo中,應(yīng)注意到:

static allocator myAlloc,即myAlloc必須是個(gè)靜態(tài)成員變量,且在類(lèi)外定義(賦初值)。如果其不是靜態(tài)成員變量時(shí),則在構(gòu)建class Foo類(lèi)對(duì)象時(shí),是沒(méi)辦法調(diào)用到myAlloc的。因?yàn)榉庆o態(tài)成員變量只能通過(guò)對(duì)象調(diào)用【但此時(shí)Foo對(duì)象還沒(méi)生成又如何調(diào)用??!】。而myAlloc又是用來(lái)生成Foo類(lèi)對(duì)象的,所以得通過(guò)類(lèi)名調(diào)用即應(yīng)設(shè)置為static類(lèi)型。

而class allocator的如下:

class allocator{
private:
	struct obj{
		struct obj* next;
	};
public:
	static void* allocate(size_t);
	static void deallocate(void*, size_t);
private:
	obj* freeStore = nullptr;
	const int CHUNK = 5; // 標(biāo)準(zhǔn)庫(kù)一般設(shè)置為20
};
void* allocator::allocate(size_t size){
	obj* p;
	if(!freeStore){
		// linked list為空,則申請(qǐng)一大塊
		size_t chunk = CHUNK * size;
		freeStore = p =(obj*)malloc(chunk); // 這里直接調(diào)用malloc進(jìn)行分配空間
		// 將分配的一大塊切分成5小段,并串接起來(lái)
		for(int i = 0; i < (CHUNK - 1); ++i){
			p->next = (obj*)((char*)p + size);
			p = p->next;
			// 上面這兩步相當(dāng)于p->next = p + 1,
			// 只不過(guò)這里需要適應(yīng)不同的類(lèi)下的操作,因而設(shè)置成這種形式?。?
		}
		p->next = nullptr; // 最后一小段的下一個(gè)位置指向空
	}
	p = freeStore;
	freeStore = freeStore->next;
	return p;
}
void allocator::deallocate(void* p, size_t){
	// 將要?jiǎng)h除的*p的位置調(diào)整為free list的頭端
	((obj*)p)->next = freeStore;
	freeStore = (obj*)p;
}

四、macro for static allocator(per-class allocator 4)

由第三版本知,其黃色部分我們想將其定義為宏操作,進(jìn)一步簡(jiǎn)化代碼內(nèi)容:

// DECLARE_POOL_ALLOC  used in class definition
#define DECLARE_POOL_ALLOC()\
public:\
    void* operator new(size_t size){
        return myAlloc.cllocate(size);
    }\
    void operator delete(void* p){
        myAlloc.deallocate(p, 0);
    }\
protected:\
    static allocator myAlloc;

// IMPLEMENT_POOL_ALLOC   used in class implementation file
#define IMPLEMENT_POOL_ALLOC(class_name)\
    allocator class_name::myAlloc;

使用實(shí)例如圖所示:

在類(lèi)內(nèi)進(jìn)行宏聲明,在類(lèi)外進(jìn)行宏定義【告訴編譯器傳入?yún)?shù)的class type】

New Handler

=default,=delete

一個(gè)是需要默認(rèn)版本,另一個(gè)是這個(gè)函數(shù)我不要。

這兩個(gè)函數(shù)不僅使用構(gòu)造,同時(shí)適用于 operator new 和 operator delete。

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

相關(guān)文章

  • C++實(shí)例代碼詳解友元函數(shù)

    C++實(shí)例代碼詳解友元函數(shù)

    采用類(lèi)的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類(lèi)的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類(lèi)與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類(lèi)的一部分,但又需要頻繁地訪問(wèn)類(lèi)的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類(lèi)的友元函數(shù)
    2022-06-06
  • Qt QTreeWidget 樹(shù)形結(jié)構(gòu)實(shí)現(xiàn)代碼

    Qt QTreeWidget 樹(shù)形結(jié)構(gòu)實(shí)現(xiàn)代碼

    Qt中實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)可以使用QTreeWidget類(lèi),也可以使用QTreeView類(lèi),QTreeWidget繼承自QTreeView類(lèi),接下來(lái)通過(guò)本文給大家介紹Qt QTreeWidget 樹(shù)形結(jié)構(gòu)實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2021-11-11
  • 詳解C++中函數(shù)模板的定義與使用

    詳解C++中函數(shù)模板的定義與使用

    函數(shù)模板實(shí)質(zhì)就是參數(shù)化數(shù)據(jù)類(lèi)型,稱(chēng)這種編程模式為數(shù)據(jù)類(lèi)型泛化編程。本文將通過(guò)示例來(lái)和大家一起了解下C++中函數(shù)模板的定義與使用,需要的可以參考一下
    2022-09-09
  • C++語(yǔ)言 STL容器list總結(jié)

    C++語(yǔ)言 STL容器list總結(jié)

    這篇文章主要介紹了C++語(yǔ)言 STL容器list總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 關(guān)于C/C++中可變參數(shù)的詳細(xì)介紹(va_list,va_start,va_arg,va_end)

    關(guān)于C/C++中可變參數(shù)的詳細(xì)介紹(va_list,va_start,va_arg,va_end)

    可變參數(shù)的函數(shù)原理其實(shí)很簡(jiǎn)單,而va系列是以宏定義來(lái)定義的,實(shí)現(xiàn)跟堆棧相關(guān).我們寫(xiě)一個(gè)可變函數(shù)的C函數(shù)時(shí),有利也有弊,所以在不必要的場(chǎng)合,我們無(wú)需用到可變參數(shù)。如果在C++里,我們應(yīng)該利用C++的多態(tài)性來(lái)實(shí)現(xiàn)可變參數(shù)的功能,盡量避免用C語(yǔ)言的方式來(lái)實(shí)現(xiàn)
    2013-10-10
  • 深入聊聊C語(yǔ)言中的Const關(guān)鍵字

    深入聊聊C語(yǔ)言中的Const關(guān)鍵字

    關(guān)鍵字const用來(lái)定義只讀變量,被const定義的變量它的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中Const關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 淺談C++的語(yǔ)句語(yǔ)法與強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換

    淺談C++的語(yǔ)句語(yǔ)法與強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換

    這篇文章主要介紹了淺談C++的語(yǔ)句語(yǔ)法與強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序

    基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序

    這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • OpenCV圖像算法實(shí)現(xiàn)圖像切分圖像合并示例

    OpenCV圖像算法實(shí)現(xiàn)圖像切分圖像合并示例

    這篇文章主要為大家介紹了python圖像算法OpenCV實(shí)現(xiàn)圖像切分圖像合并操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的示例代碼

    這篇文中主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語(yǔ)句和函數(shù)實(shí)現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10

最新評(píng)論

南城县| 平昌县| 玉龙| 翁牛特旗| 隆林| 东宁县| 泰顺县| 手机| 贺州市| 广水市| 西藏| 墨玉县| 东兰县| 平阳县| 县级市| 喀喇沁旗| 万荣县| 财经| 虎林市| 梁平县| 门源| 抚宁县| 广安市| 和林格尔县| 新龙县| 湘阴县| 仙游县| 瑞昌市| 牙克石市| 静乐县| 临潭县| 水城县| 上饶市| 乌拉特中旗| 辽宁省| 乌苏市| 平度市| 洛南县| 璧山县| 杭锦后旗| 湛江市|