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.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...
乙個簡單的記憶體池
記憶體池是我們經常使用的一種池,常見的池還有程序池 執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義 池 池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。記憶體池 即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該...
乙個簡單記憶體池實現
最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等 後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方...