C allocator類學習理解

2021-09-28 11:40:43 字數 1936 閱讀 7434

一般情況下,將記憶體分配和物件構造組合在一起可能會導致不必要的浪費(有些物件可能用不了那麼多的記憶體)。在此情況下,我們希望將記憶體分配和物件構造分離。這意味著我們可以按需分配記憶體,但只在真正需要時才真正執行物件的記憶體擴充操作(同時付出一定開銷)。常見的容器vector的記憶體分配就是這種方案。

pointer allocate

(size_type n)

;

分配儲存塊;嘗試分配n個t個型別的儲存空間,然後返回第乙個元素的起始位址;只分配空間,不構造物件

void

construct

(u* p, t a)

;

在p所指記憶體中構造乙個t型別的物件a

void destroy (t* p)

;

呼叫析構函式銷毀p所指的物件,但不會釋放空間,也就意味著,這段空間依然可以使用

void

deallocate

(pointer p, size_t n)

;

釋放先前allocate分配的且沒有被釋放的儲存空間,意味著**空間

p:指向以前使用allocator :: allocate分配的儲存塊的指標。

n:在呼叫allocator :: allocate時為這個儲存塊分配的元素數量。

allocator與類繫結,因為allocator是乙個泛型類

allocate()申請指定大小空間

construct()構建物件,其引數為可變引數,所以可以選擇匹配的建構函式

使用,與其它指標使用無異

destroy()析構物件,此時空間還是可以使用

deallocate()**空間

#include

#include

using std::cout;

using std::endl;

template

<

typename tp>

class

vector

~vector()

}void

push_back

(const tp& value)

void

pop_back()

}

size_t size()

const

size_t capacity()

const

tp &

operator

(size_t idx)

private

:static std::allocator _alloc;

tp* _elems;

tp* _first_free;

tp* _end;

void

reallocate()

_elems=newelems;

_first_free=_elems+oldcapacity;

_end=_elems+newcapacity;}}

;template

<

typename tp>

std::allocator vector

::_alloc;

//構造例項

void

display

(vector<

int>

& vec)

#include

#include

"m_vector.h"

using std::cout;

using std::endl;

intmain

(int argc,

char

** ar**)

cout<}

C Allocator學習筆記

new有個特殊用法,如下 base p base operator new sizeof base new p base 其中第二行的意思是將p中的位址中的連續空間當做是base類,然後呼叫base的建構函式。這個new的用法稱之為placement new。placement new的用途是可以將...

c 類的學習及理解

class a a是類的名字,相當於乙個自製資料型別 可以內聯,即上面直接在類定義中定義 還可以在內部宣告,外部定義,形式如下 double a getdoublenum void 其中 為範圍解析運算子 4.呼叫 舉例說明 a a1 double te 0.0 a1.num 10 te a1.ge...

理解控制代碼類

在 類的幫助下,我們已經可以實現在乙個容器裡儲存乙個類層次裡所有型別的物件,但是 有乙個很明顯的缺點,就是需要複製物件,當乙個物件非常大或者是一種不能輕易複製的資源的時候,這個實現遇到了很大的困難,於是我們有了控制代碼 handle 類這個技術。我們有這麼乙個類 class point point ...