第18章 特殊工具與技術 5

2022-09-24 01:06:10 字數 2240 閱讀 5893

18.1.7 乙個記憶體分配器基類

需要怎樣改進內建庫的new和delete函式?乙個通用策略是預先分配一塊原始記憶體來儲存未構造的物件,建立新元素的時候,可以在乙個預先分配的物件中構造;釋放元素的時候,將它們放回預先分配的塊中,而不是將記憶體實際返還給系統。這種策略常被稱為維持乙個自由列表(freelist)。可以將自由列表實現為已分配但未構造的物件的鍊錶。

1. cachedobj

template 

class cachedobj 

protected: 

t *next; 

private: 

static void add_to_freelist(t*); 

static std::allocator alloc_mem; 

static t *freestore; 

static const void std::size_t chunk; 

}; template

class cachedobj

protected:

t *next;

private:

static void add_to_freelist(t*);

static std::allocator alloc_mem;

static t *freestore;

static const void std::size_t chunk;

};2. 使用cachedobj

template 

class queueitem1:public cachedobj>{}; 

template

class queueitem1:public cachedobj>{};3. 分配怎樣工作

queueitem1 *qi=new queueitem1(); 

queueitem1 *qi=new queueitem1();因為我們從cachedobj類派生queueitem類,任何使用new表示式的分配,都分配並構造乙個新的queueitem物件。每個表示式:

(1)使用 queueitem::operator new函式從自由列表分配乙個物件。

(2)為型別t使用元素型別的複製建構函式,在該記憶體中構造乙個物件。

類似地,當像delete pt;這樣刪除乙個queueitem指標的時候,執行queueitem析構函式清除pt指向的物件,並呼叫該類的operator delete,將元素所用的內存放回自由列表。

4. 定義operator new

template 

void *cachedobj::operator new(size_t sz) 

t *p=freestore; 

freestore=freestore->cachedobj::next; 

return p; 

} template

void *cachedobj::operator new(size_t sz)

t *p=freestore;

freestore=freestore->cachedobj::next;

return p;

}5. 定義operator delete

operator delete成員只負責管理記憶體,在析構函式中已經清楚了物件本身,delete表示式在呼叫operator delete之前呼叫析構函式。它呼叫add_to_freelist成員將被刪除物件放回自由列表。

template 

void cachedobj::operator delete(void* p, size_t) 

template

void cachedobj::operator delete(void* p, size_t)6. add_to_freelist成員

template 

void cachedobj::add_to_freelist(t *p) 

template

void cachedobj::add_to_freelist(t *p)為了避免任何與派生類中定義的成員可能的衝突,顯式指定我們正在給基類成員next賦值。

7. 定義靜態資料成員

template 

std::allocator cachedobj::alloc_mem; 

template 

t *cachedobj::freestore=0; 

template 

const std::size_t cachedobj::chunk=24; 

摘自 xufei96的專欄

第18章 特殊工具與技術 5

18.2 執行時型別識別 通過執行時型別識別 rtti 程式能夠使用基類的指標或引用來檢索這些指標或引用所指物件的實際派生型別。通過下面兩個操作符提供rtti 1 typeid操作符,返回指標或引用所指物件的實際型別。2 dynamic cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指...

第18章 特殊工具與技術 4

18.1.6 類特定的new和delete 編譯器看到類型別的new或delete表示式的時候,它檢視該類是否有operator new或operator delete成員,如果類定義 或繼承 了自己的成員new和delete函式,則使用那些函式為物件分配和釋放記憶體 否則,呼叫這些函式的標準庫版本...

第18章 特殊工具與技術 6

18.2 執行時型別識別 通過執行時型別識別 rtti 程式能夠使用基類的指標或引用來檢索這些指標或引用所指物件的實際派生型別。通過下面兩個操作符提供rtti 1 typeid操作符,返回指標或引用所指物件的實際型別。2 dynamic cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指...