C 記憶體池的實現

2021-10-08 03:25:28 字數 3082 閱讀 6732

記憶體池是一種自主的記憶體管理機制。就是將我們的記憶體管理放在了應用程式端。

那麼它的簡單處理做了什麼事呢?

首先,我們從堆上分配出一塊很大的記憶體塊。接著我們按照劃分將其劃分成每個不同的小組。這個每個小組儲存乙個資料塊。針對於每個小組的組內來說就是乙個簡單的資料結構。這個資料結構我們將其分為兩個部分,這兩部分代表分別儲存資料的資料域找到下乙個指標的指標域。

劃分好之後我們用乙個標誌來標誌它的起始位置。最後形成乙個靜態鍊錶的組織方式,將第乙個記憶體單元的指標域指向第二個記憶體單元。第二個記憶體單元指向下乙個記憶體單元。如下圖所示:

現在這個記憶體塊管理的是未分配的記憶體單元。

這個設計是將記憶體池和使用類單獨分開來設計。我們是先設計乙個記憶體池實現的類,然後再設計使用類。這個使用類的設計我們是這樣的:如果這個使用類中有new,那麼如果它通過operator new來處理的時候可以在operator new裡面實現自主的記憶體管理。

那麼我們實現的時候使用類是如何在記憶體池上開闢記憶體的呢?

這樣的話這兩個類就應該產生乙個叫資訊互動的類。也就是這兩個類應該進行訊息通訊。那麼在c++中最簡單的訊息通訊就是產生介面。那麼另乙個類只要呼叫它的介面完成這個行為就可以了。所以在通用記憶體池的實現中我們只要讓使用類去呼叫記憶體池的通用介面就可以了。

那麼記憶體池應該提供哪些介面呢?

我們知道記憶體池的本質管理的是堆記憶體。那麼記憶體的管理的第一件事就是alloc()開闢記憶體。第二件事就是dealloc()**記憶體。

所以記憶體池對外就提供兩個介面:

1、alloc();申請記憶體

2、dealloc();釋放記憶體

如下圖所示:

//記憶體池類

void

*alloc

(size_t size)

pcur-

>next =

null;}

void

* rt = pool;

pool = pool-

>next;

return rt;

}void

*dealloc

(void

* ptr)

nptr-

>pnext = pool;

pool = nptr;

}private

:struct node

public

: t val;

node* pnext;};

node* pool;};

class

student

void

*operator

new(size_t size)

void

operator

delete

(void

* ptr)

private

: std::string mname;

std::string mid;

int mage;

static mem_pool mm;};

mem_pool student::mm;

intmain()

const

int mem_size =10;

template

<

typename t>

class

mem_pool

//記憶體池類

return ppm;

}void

*alloc

(size_t size)

pcur-

>next =

null;}

void

* rt = pool;

pool = pool-

>next;

return rt;

}void

*dealloc

(void

* ptr)

nptr-

>pnext = pool;

pool = nptr;

}private

:mem_pool()

mem_pool

(const mem_pool&)

;struct node

public

: t val;

node* pnext;};

node* pool;

static mem_pool

* ppm;};

template

<

typename t>

mem_pool

* mem_pool

::ppm =

null

;class

student

void

*operator

new(size_t size)

void

operator

delete

(void

* ptr)

private

: std::string mname;

std::string mid;

int mage;

static mem_pool pmm;};

mem_pool

* student::pmm = mem_pool

::getinstance()

;int

main()

c/c++下分配足夠的記憶體、追蹤記憶體的分配、在不需要的時候釋放記憶體—這是相當複雜。而直接使用系統呼叫malloc/free、new/delete進行記憶體分配和釋放,有以下弊端:

C 記憶體池的實現

file memorypool.h note hangzhou hikvision system technology co.ltd.all right reserved.brief windows下記憶體池的實現 author zhangpeng nj 163.com date 11 15 201...

記憶體池的C 實現。

原文 最近在學習c 程式效能優化,讀到記憶體池部分。自己動手寫了乙個,小小測試了一下應該沒有問題。記憶體塊memoryblock宣告檔案 cpp view plain copy pragma once define ushort unsigned short define ulong unsigne...

記憶體池 C 記憶體池

c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...