通用的記憶體池
首先開闢大記憶體塊,以靜態鍊錶
的形式組織,有好多節點,每個
節點分兩部分:資料儲存使用和記憶體管理使用
這兩部分每次開闢應開闢多少?
假設開闢乙個節點:new 乙個 int ,系統計算出是4個位元組,傳給 size ,
開闢的時候應該是 4+4 (資料儲存使用和記憶體管理使用)
假設現在設計乙個學生類,再設計乙個記憶體池類
學生類
每次 new student ,在裡面提供operator new , operator delete
(在哪個類中 new ,就在哪個類中提供這兩個)
針對記憶體池
,是管理
記憶體的。 記憶體
開闢好之後,
如何進行
管理?
在記憶體池裡面寫兩個函式,alloc(開闢記憶體) dealloc(釋放記憶體)
,對外提供兩個介面
使用時
,讓學生類和記憶體池類進行互動,operator new 呼叫 alloc 介面,operator delete 呼叫 dealloc 介面
。然後在 student 裡面,針對 student 通過 operator new , operator delete 進行資訊互動,間接呼叫 alloc ,dealloc 操作記憶體
#include using namespace std;
//通用的記憶體池與簡單記憶體池的區別:
//通用的記憶體池把 operator new 函式分離開,記憶體管理不依賴於具體某個類,達到通用的目標。
const int mem_size = 10;
template//t的型別代表學生類
class mem_pool
void* alloc(size_t size)//這兩個函式底層操作乙個資料結構,資料結構中節點如何組織?
pcur->pnext = null;
} node* rt = pool;
pool = pool->pnext;
return rt;
} void dealloc(void* ptr)
private:
//將介面遮蔽起來
mem_pool(){} //*
mem_pool(const mem_pool&); //* //拷貝建構函式不需要實現,只需宣告即可
class node //節點的組織
public:
t mdata;
node* pnext;
}; static mem_poolmempool; //* //靜態成員物件(類中自身的物件)
//static * pool;//這個指標指向未使用部分起始的位置,指標型別如何確定?根據模板和節點確定
static node* pool;//靜態變數必須類外初始化
};templatetypename mem_pool::node* mem_pool::pool = null;
//node 屬於mem_pool 作用域下的型別,屬於模板型別的前面一定加 typename 關鍵字,
//pool 屬於mem_pool 作用域下的成員變數,將其初始化為空
templatemem_poolmem_pool::mempool;//靜態成員物件類外初始化,唯一物件生成好了
class student
void* operator new(size_t size)
void operator delete(void* ptr)
private:
string mname;
int mage;
bool m***;
static mem_pool* mpool;//靜態變數必須類外初始化
};//mem_pool* student::mpool = new mem_pool(); //此時new 根本無法訪問建構函式
mem_pool* student::mpool = mem_pool::getinstance();//通過介面 getinstance 返回唯一物件
int main()
pool剛開始為空
往下走乙個(逐過程)發現資料域部分儲存student 的物件(裡面為空)
pnext 裡面9個結點,1個結點已使用
此時mem_pool::pool 0x00eabfe8 ,向下走,發現改變
說明0x00eabfe8被分配出去
轉到pstu2 看一下,發現為0x00eabfe8
依次類推,每個物件被初始化。
整個記憶體池設計成模板
mem_pool:用 student 例項化模板 mem_pool 生成 mem_pool類
針對所有的 student ,都用這個記憶體池儲存的
思考:需不需要將這個類設計成單例模式?
所有的 student 其實用乙個記憶體池管理就行,所以需要將 mem_pool 模板寫成單例模式
單例模式的功能:要求整個類只能生成乙個物件
單例模式的實現:1.遮蔽類中生成物件的介面(建構函式 和 拷貝函式)
2.類中提供乙個介面來生成物件 (
在單例模式的實現**中用//*標識)
單例模式
往下走,發現1-4位址相同,即實現了單例模式
通用執行緒池
將runable和callable包裝成runnablefuture物件,呼叫子類實現的execute runablefuture 防範 throws rejectedexecutionexception throws nullpointerexception public future submi...
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...
記憶體池 執行緒池
1 記憶體池是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是,使得記憶體分配效率得到提公升。2 執行緒池是一種多執行緒處理形式,處理過程中將任務新...