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