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