記憶體池 佇列

2021-10-11 09:58:18 字數 2990 閱讀 4626

傳統的記憶體分配:

1.外碎片

當我們只有紅色部分申請4位元組的記憶體時,其他的都使用8位元組的記憶體,包括後序的申請都是8位元組的空間,那麼這個4位元組的記憶體就分配不出去了,這個時候4位元組的記憶體就是外碎片

2.內碎片

大多都是記憶體對齊引起的,比如:

struct a

;

我們知道,在32位機器下,a的大小是8。所以在生成物件的時候是分配了8個位元組的空間,但是裡面只使用了5位元組的記憶體空間,這就叫做內碎片。

為了實現自主的申請記憶體自主的釋放記憶體,不借助系統的操作,提出來池的概念–記憶體池

接下來我用記憶體池去實現佇列:

#include

//用記憶體池實現佇列

template

<

typename t>

class

queue

;const

int queueitem_count =10;

//記憶體池

template

<

typename t>

class

queueitem

void

*operator

new(size_t size)

pcur-

>pnext =

null;}

void

*ptr = pool;

pool = pool-

>pnext;

return ptr;

}void

operator

delete

(void

*ptr)

private

:template

<

typename t>

friend

class

queue

; t mdata;

queueitem

*pnext;

static queueitem

* pool;};

template

<

typename t>

queueitem

* queueitem

::pool =

null

;#pragma warning(disable:4996);

template

<

typename t>

class

queue

~queue()

phead =

null;}

void

push

(t val)

bool

empty()

void

pop(

) queueitem

* pcur = phead-

>pnext;

phead-

>pnext = pcur-

>pnext;

delete pcur;

} t back()

return ptail-

>mdata;

} t front()

return phead-

>pnext-

>mdata;

}private

: queueitem

*phead;

queueitem

*ptail;};

intmain()

que.

pop();

auto front = que.

front()

;auto back = que.

back()

; std::cout << front << std::endl;

std::cout << back << std::endl;

return0;

}

此設計記憶體池通用性不高,只能設計佇列。

下面是通用記憶體池的設計:

//通用的記憶體池

const

int mem_size =10;

template

<

typename t>

class

mem_pool

void

*alloc

(rsize_t size)

pcur-

>next =

null;}

void

* rt = pool;

pool = pool-

>next;

return rt;

}void

dealloc

(void

* ptr)

pptr-

>next = pool;

pool = pptr;

}private

:class

node

public

: t mdata;

node* next;};

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;

記憶體池 C 記憶體池

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

記憶體池 執行緒池

1 記憶體池是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是,使得記憶體分配效率得到提公升。2 執行緒池是一種多執行緒處理形式,處理過程中將任務新...

記憶體池,程序池,執行緒池

在使用new malloc在堆區申請一塊記憶體的時候,由於每次申請的記憶體大小不一樣就會產生很多記憶體碎片,不好管理和浪費。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠用再 繼續申請新的記憶...