乙個簡單的alloctor類實現

2021-08-01 16:56:34 字數 1697 閱讀 3117

allocator類是c++的乙個模板,它提供型別化的記憶體分配以及物件的分配和撤銷。allocator類將物件分配和物件構造分開。當allocator物件分配記憶體的時候,它會分配適當大小並排列成儲存給定型別物件的空間。下面是allocator 的乙個簡單實現:

templateinline t* _allocate(ptrdiff_t size, t*) 

return tmp;

}templateinline void _deallocate(t* buffer)

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

templateinline void _destroy(t *ptr)

templateclass allocator ;

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

void deallocate(pointer p, size_type n)

void construct(pointer p, const t& value)

pointer address(reference x)

const_pointer const_address(const_reference x)

size_type max_size()const

};

allocator類是c++的乙個模板,它提供型別化的記憶體分配以及物件的分配和撤銷。allocator類將物件分配和物件構造分開。當allocator物件分配記憶體的時候,它會分配適當大小並排列成儲存給定型別物件的空間。

下面是allocator類的使用:

allocatoralloc;                 //可以分配string的allocator物件

auto const p=alloc.allocate(n);    //分配n個未初始化的string

allocator 分配的記憶體是未構造的。我們按需要在此記憶體中構造物件。在新標準庫中,construct 成員函式接受乙個指標和零個或多個額外引數,在給定位置構造乙個元素。額外引數用來初始化構造物件。

auto q=p;                                   //q指向最後構造的元素之後的位置

alloc.construct(q++);                  //*q為空字串

alloc.construct(q++,10,'c');         //*q為cccccccccc

alloc.construct(q++,"hi");            //*q為hi

當用完物件後,必須對每個構造的元素呼叫destroy 來銷毀它們。函式destroy 接受乙個指標,對指向的物件執行折鉤函式:

while(q!=p)

alloc.destroy(--q);                  //釋放我們真正構造的string

一旦元素被銷毀後,就可以重新使用這部分記憶體來儲存其他 string,也可以將其歸還給系統。釋放記憶體通過呼叫 deallocate 來完成:

alloc.deallocate(p,n);  

傳遞給deallocate的指標不能為空,它必須指向由allocate 分配的記憶體。而且,傳遞給 deallocate 的大小引數必須與呼叫 allocated分配記憶體時提供的大小引數具有一樣的值。

乙個簡單的hello world交叉編譯實驗

交叉編譯,簡單地說,就是在乙個平台上生成另乙個平台上的可執行 下面就做乙個簡單的hello world實驗來完成這一過程。本實驗涉及兩台主機。a主機 安裝交叉編譯環境,並用來編譯原始檔。在本次實驗中使用的是虛擬機器ubuntu系統環境 b主機 arm架構平台開發板,用來執行a主機編譯好的可執行檔案,...

乙個簡單的矩陣類

原 核心部分來自 的 我在其基礎上做了一點改動,加上了一些運算,同時也發現了 的一點小問題。類是基於stl裡的valarray的,因為主要是用來演示演算法用的,所以沒有對效率做過多的考慮。valarray 本身給我們提供了很多方便的運算,因為,我基本都是用的valarray的演算法,沒有重寫。不過,...

乙個簡單的日誌類

放乙個以前做的,一直用著的日誌類。比較短,也不用碼很多字去說明,如下 1 2 日誌類 log.cs34 5 用法 6 ningtao.log mylog new ningtao.log 日誌名稱 7 mylog.addlog 日誌資訊 8 新增一條日誌時 9 目錄結構 日誌名稱 年月 日.log 1...