記憶體分配器基類

2021-06-22 03:50:05 字數 1766 閱讀 4837

自由列表:實現為已分配但未構造物件的鍊錶。

策略:預先分配一塊原始記憶體來儲存未構造的物件,建立新元素的時候,可以在乙個預先分配的物件中構造;

釋放元素的時候,將其放回預先分配物件的塊中,而不是將記憶體歸還給系統

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物件 ...