乙個最簡單的記憶體池AutoMemory

2021-07-16 21:50:10 字數 1615 閱讀 4654

c/c++中記憶體管理是個最麻煩的事情,記憶體申請釋放,記憶體洩露,記憶體越界,甚至是記憶體碎片,就會導致程式出core或者變慢。如何有效的管理記憶體,有很多方法,我認為最簡單的方式是用乙個記憶體池來管理記憶體。

談到記憶體池的時候,就有必要說下程式的生命週期和作用域,資料分為三類:1類是程序資料(全域性資料)。2、執行緒資料,每乙個執行緒乙份。3、請求資料,每一次呼叫乙份。

如果乙個記憶體池想什麼生命週期和作用域的資料都放在裡面,可能是不合適的。所以我建議的使用方式是:程序乙個記憶體池、每乙個執行緒乙個記憶體池、每個請求乙個記憶體池。

在程序/執行緒/請求初始時初始記憶體池,在程序/執行緒/請求結束時銷毀記憶體池。

所以,就有了下面這個非常簡單的記憶體池了,**有一點點繞,不過仔細閱讀還是能理解的。

標頭檔案 automemory.h

#ifndef _auto_memory_h__

#define _auto_memory_h__

#include //#define _mem_test_

//#define _mem_debug_

#define _mem_use_

//default 1m

#define memory_block_size 1000000

/* * 執行緒相容,自動釋放

*/class automemory

;private:

int headersize;

int blocksize;

size_t memsize;

int blockcount;

char* begin;

char* end;

//memblock* currblock;

};#endif

cpp檔案automemory.cpp

#include #include #include #include "automemory.h"

automemory::automemory()

automemory::automemory(int block_size)

automemory::~automemory()

size_t automemory::memsize()

int automemory::blockcount()

size_t automemory::leftsize()

void automemory::debug()

void* automemory::alloc(size_t size)else

blockcount += 1;

memsize += size;

return end;

} else

} return end -= size;

}void automemory::free(void* ptr)

void automemory::freeall()

begin = end = (char*)headersize;

memsize = 0;

blockcount = 0;

}#ifdef _mem_test_

int main()

#endif

乙個簡單的記憶體池

為什仫要使用記憶體池?1.通常我們用new delete和malloc free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.2.避免記憶體碎片 傳統的new delete的弊端 1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...

乙個簡單的記憶體池

記憶體池是我們經常使用的一種池,常見的池還有程序池 執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義 池 池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。記憶體池 即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該...

乙個簡單記憶體池實現

最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等 後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方...