自由列表:實現為已分配但未構造物件的鍊錶。
策略:預先分配一塊原始記憶體來儲存未構造的物件,建立新元素的時候,可以在乙個預先分配的物件中構造;
釋放元素的時候,將其放回預先分配物件的塊中,而不是將記憶體歸還給系統。
operator new將新分配的物件放到自由列表;
operator delete將物件放回自由列表。
templateclass cacheobj
protected:
t* next;
private:
static void add_to_freelist(t*);
static std::allocatoralloc_mem;
static t* freestore;
static const std::size_t chunk;
};
static成員管理自由列表,用static是因為為所有給定型別的物件維持乙個自由列表。
cacheobj的工作只是分配和管理已分配但未構造物件的自由列表
使用cacheobj類,模板形參
templateclass queueitem: public cacheobj< queueitem>
queueitem是從儲存queueitem型別物件的cacheobj例項派生而來的類模板。
如定義int值的queue,就從cacheobj>派生queueitem類。
templatevoid* cacheobj::operator new(size_t sz)
t* p = freestore;
freestore = freestore->cacheobj::next;
return p;
}
注意:
t* p = freestore; //在前,用於返回自由列表的第乙個物件的位址
freestore = freestore->cacheobj::next; //指標重置為自由列表的下乙個元素,返回的物件是未構造的,因為用new來構造物件
templatevoid cacheobj::operator delete(void* p, size_t)
編譯器將物件的位址傳給operator delete,
指標的型別必須是void*型別,因此需要強制型別轉換。
templatevoid cacheobj::add_to_freelist(t* p)
注:型別t是派生型別,指標p是指向t型別的,而不是cacheobj型別????cacheobj是作為基類使用。
新插入自由列表的為表頭freestore,只能這麼設計嗎??
定義靜態資料成員
template allocatorcacheobj::alloc_mem;
template t* cacheobj::freestore;
template const size_t cacheobj::chunk = 24;
每個型別使用不同的靜態成員來例項化cacheobj類。
記憶體分配 定長記憶體分配器
在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...
記憶體分配器一
glibc記憶體管理學習 x86平台linux程序記憶體布局 text elf格式程式 data 程式執行時就能確定的資料,可讀可寫 bss 沒有初始化的全域性變數和靜態表裡 heap stack 由編譯器自動分配釋放,存放函式引數 區域性變數等 mmap 對映區域 實現乙個malloc 分頁與位址...
(六)記憶體分配器
c 的stl中定義了很多容器,容器的第二個模板引數通常為allocator型別。標準庫中allocator類定義在標頭檔案memory中,用於幫助將記憶體分配和物件的構造分離開來。它分配的記憶體是原始的 未構造的。allocatoralloc 定義了乙個可以分配string的allocator物件 ...