c 實現乙個簡單的空間配置器allocator

2021-06-26 14:07:07 字數 2133 閱讀 3101

c++中記憶體分配和物件構造是分開來的,記憶體的分配類似malloc函式在記憶體空間開闢一段空間,但是裡面不儲存任何資料。物件的構造相當於給這段空間複製。

這麼做的理由有兩點:

c++中記憶體分配一般有三個層次:

使用new建立物件, delete刪除物件

使用allocator分配未初始化的記憶體,使用construct和destroy構造和析構物件

使用operator new分配記憶體,operator delete刪除記憶體,placement new建立物件,顯式呼叫析構函式析構物件

當使用new表示式時,實際發生三個步驟。首先,該表示式呼叫名為operator new的標準函式庫,分配足夠大的原始的未初始化的記憶體,以儲存指定型別的乙個物件;接下來,執行該型別的乙個建構函式,用指定初始化式構造物件;最後,返回指向新分配並構造的物件的指標。

當使用delete的時候類似,先適當的析構,然後釋放記憶體 .

void main()

使用allocator類,它提供各種型別的記憶體分配和物件的構造與撤銷,allocator類講記憶體分配和物件構造分開。當allocator物件分配記憶體時,它分配適當大小並排列成儲存給定型別物件的空間。但是,它分配的記憶體時未構造的,allocator的使用者必須分別使用construct和destory放置在改記憶體中的物件。

#include#include//使用allocator必須包含memory

using namespace std;

void main()

結果:10

請按任意鍵繼續. . .

使用標準庫函式operator new和operator delete,使用它們可以獲得未構造的記憶體,下面的*p=10相當於建構函式.

#includeusing namespace std;

void main()

使用placement new表示式來構造物件,指在已分配的原始記憶體中初始化乙個物件,它不分配記憶體,只構造物件,它可以使用任何建構函式,並直接建立物件,相對於allocator中的construct就比較靈活,construct只能使用複製建構函式,這樣在進製使用複製建構函式的地方allocator是不能用的。

placement new的形式為:

new (placae-address) type;

new(placae-address) type (initializer-list)

#includeusing namespace std;

void main()

再舉個類的例子

#includeusing namespace std;

class a

;void main()

有了上面的例子,我們就可以設計乙個我們自定義的簡單的空間配置器

#includeusing namespace std;

//分配記憶體

templateinline t* _allocate(unsigned int size,t*)

//構造物件

templateinline void _construct(t1 *p,const t2 &value)

//析構物件

templateinline void _destory(t *ptr)

//我的空間配置器

templateclass myallocator

; pointer allocate(size_type n,const void *hint=0)

void deallocate(pointer p,size_type n)

void construct(pointer p,const t &value)

void destroy(pointer p) };

//主函式,檢查正確性

void main()

STL 實現簡單的空間配置器

實現方式 stl原始碼中的空間配置器的實現分為一級與二級空間配置器 所謂的一級空間配置器 實現特點 直接使用malloc函式申請記憶體 自定義清除函式 當malloc失敗之後,呼叫清除函式來釋放一部分的記憶體空間,以便malloc的成功 假設呼叫清除函式之後,還是malloc失敗的話,就需要丟擲異常...

C 實現乙個簡單的計算器

乙個用堆和棧實現的簡單計算器,可以進行非負數之間的加減乘除運算 可以是個位數也可以是多位數 這個計算器就是用棧和佇列進行乙個手算過程的模擬,也不算難 下面是 include include include include include using namespace std int main if...

實現乙個簡單的裝飾器

下面示例定義了乙個裝飾器,它會在每次呼叫被裝飾的函式時計時,然後把經過的時間 傳入的引數和呼叫的結果列印出來。import time defclock func def clocked args t0 time.perf counter result func args elapsed time.p...