c語言可以使用
alloc
從棧上動態分配記憶體。
malloc/free或者
new/delete
大量使用會造成記憶體碎片,這種碎片形成的機理如下:
記憶體碎片一般是由於空閒的記憶體空間比要連續申請的空間小,導致這些小記憶體塊不能被充分的利用,舉個例子:
如果有100
個單位的連續空閒記憶體,那麼先申請
3單元的連續記憶體,再申請
50單元的記憶體,這時釋放一開始的
3單元的記憶體。這時,如果你一直申請比三單元大的記憶體單元,那麼開始的那連續的三單元就一直不能被使用。
乙個簡單的記憶體池的寫法:
struct
memblock
;struct
mempool
;typedef
void
(*free_callback)(
void
*);//釋放**函式,釋放
membloc.data
用,可以簡單的直接用
free
函式void
mempool_init(
intinitialsize,
intdatasize);
//初始化
mempool
void
mempool_dealloc(
struct
mempool* pool,free_callback callback);
//釋放
mempool
void
* mempool_get(
struct
mempool* pool);
//獲取乙個
memblock
void
mempool_release(
struct
mempool* pool,
struct
memblock* block);
//歸還乙個
memblock
/*********************************
* mempool
* ******************************/
//malloc乙個
memblock
static
struct
memblock* mempool_allocblock(
struct
mempool* pool );
//------------------implement--------
void
*mempool_init(
intinitialsize,
intdatasize )
return
( pool );
}void
mempool_dealloc(
struct
mempool* pool, free_callback callback )
free( block );
}free( pool );
l_debug( "%s:size(%d),unused(%d)", __func__, pool->size, pool->unused );
}static
struct
memblock*
mempool_allocblock(
struct
mempool* pool )
void
mempool_release(
struct
mempool* pool,
struct
memblock* block )
if( block->used != 1 )
//將歸還的記憶體塊放到空閒煉表頭。
block->used = 0;
//表示空閒
block->next = pool->free_linkhead;
pool->free_linkhead = block;
pool->unused++;
//空閒數+1}
void
*mempool_get(
struct
mempool* pool )
else
return
( block );
}來自為知筆記(wiz)
C 記憶體管理 記憶體池
很多內容來自於網際網路,如有侵權,請告知。另外,從 收穫很多,在此表示感謝。我們寫程式經常需要 malloc 和 new 一塊記憶體出來,這些記憶體是在堆上進行分配的,在堆上分配的記憶體和在棧上分配的記憶體不同,可以長久的儲存。堆是什麼 可以把你的程序空間 想象成 4g 大小的記憶體 32 為機子上...
C 記憶體管理 記憶體池
引子 一 單獨類記憶體池 classa intget void operator new size t void operator delete void size t private a next static a freestore 指向可用首位址 static const int achunk...
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...