書式#include <iostreamの>
名前空間stdを使用。
constexprのint型MEMORYPOOL_ALIGNMENT = 8; //長さが揃え
//メモリブロック
テンプレート<typenameに_T>
構造体メモリブロック{
int型nsizeの場合; //バイト単位でメモリブロックサイズ、
nFreeのint; //残りのメモリユニットのブロックを割り当てます
INT nFirst; //最初のユニット残数
メモリブロック* pNext; //次のメモリブロックへのポイントへのポインタ
チャーA-DATA [1]; //タグメモリ開始位置
//コンストラクタ
メモリブロック(int型nUnitSize、//ストレージユニットのサイズ、はsizeof T
INT nUnitAmount):計算するためのユニットを格納するメモリブロックのサイズ//
nsizeの場合(nUnitAmount * nUnitSize)、nFree(nUnitAmount - 1)、nFirst(1)、pNext(nullptr){
//コンストラクタを呼び出すときに割り当てられた第1のユニットは、それがnFreeを削減する必要があります
//次ユニットは、現在のユニットの最初の2つのバイトに記録されたシーケンス番号を割り当てることができ
char * = ppDate ADATA。
裁判所未満<< "メモリppDateのヘッドPTR =" <<(int型)* ppDate <<てendl;
{(; I <nUnitAmount ++ iは1 = INT)のために
//現在記憶部に記憶された単位数を割り当てることができ
(*(uint16_t *)ppDate)= I; //短い--- 16
裁判所未満<< "メモリの次の使用可能です:" <<(int型)* ppDate <<てendl;
ppDate + = nUnitSize;次ユニットへのポインタ//
}
裁判所未満<<「===========================コールメモリブロックコンストラクタ\ n」は、
}
//オーバーロード
void *型new演算子は(size_t、int型nUnitSize、int型nUnitAmount){
//長メモリブロックのメモリ空間に加えて、オブジェクト・ストレージ・スペースの合計の長さ
リターン:: new演算子(はsizeof(メモリブロック)+ nUnitAmount * nUnitSize)。
}
削除のボイド演算子(void *型のPblock){
:: delete演算子(Pblockの);
裁判所未満<<「================================コールメモリブロックのデストラクタ\ n」は、
}
}。
//メモリプール
テンプレート<typenameに_T>
構造体メモリプール{
int型nInitSize; //最初の時間のための割り当てサイズ
int型nGrowSize; //増分サイズ
int型nUnitSize; //ストレージユニットのサイズ
メモリブロック<_T> *のPblock。
メモリプール(INT _nGrowSize = 10、INT _nInitSize = 3)
:nInitSize(_nInitSize)、nGrowSize(_nGrowSize)、Pblockの(nullptr)、nUnitSize(のsizeof(_T)){
裁判所未満<<「==========================コールメモリプールコンストラクタ\ n」は、
//メモリブロックのサイズ
自動_size =はsizeof(_T)。
IF(_size> 4){
nUnitSize =(_size + MEMORYPOOL_ALIGNMENT - 1)&〜(MEMORYPOOL_ALIGNMENT - 1)。
}
そうであれば(_size <2){
nUnitSize = 2。
}
そうしないと
nUnitSize = 4。
}
〜メモリプール(){
メモリブロック<_T> * pMyBlock = Pblockの。
しばらく(pMyBlock!= nullptr){
pMyBlock = pMyBlock-> pNext。
pMyBlockを削除します。
}
裁判所未満<<「================================コールメモリプールデストラクタ\ n」は、
}
ボイド*割り当ては(size_t NUM){//型名アロケータ<_T> :: const_pointerヒント= 0
{(; I <NUM ++ iが0 = INT)のために
IF(Pblockの== nullptr){
//メモリブロックを作成します
Pblockの=(メモリブロック<_T> *)新しい(nUnitSize、nInitSize)メモリブロック<_T>(nUnitSize、nInitSize)。
リターン(void *型)pBlock-> ADATA。
}
右のメモリ・ブロックを//検索します
メモリブロック<_T> * pMyBlock = Pblockの。
しばらくpMyBlock = pMyBlock-> pNext(pMyBlock = nullptr && pMyBlock-> nFree == 0!)。
もし(pMyBlock!= nullptr){
COUTは<< "=まず、メモリスペースを見つけるために、" << pMyBlock-> nFirst <<てendl;
char * pFree = pMyBlock-> ADATA + pMyBlock-> nFirst * nUnitSize。
pMyBlock-> nFirst = *((uint16_t *)pFree)。
pMyBlock-> nFree--。
リターン(void *型)pFree。
}
そうしないと {
//メモリブロックが使い果たされたことを示す、見つかりません。
もし(nGrowSize == 0)リターンNULL;
裁判所未満<<「新しいメモリブロックを割り当てる\ n」は、
pMyBlock =(メモリブロック<_T> *)新しい(nUnitSize、nGrowSize)メモリブロック<_T>(nUnitSize、nGrowSize)。
//戻り値に失敗
もし(pMyBlock == nullptr)リターンNULL;
//リンクリストに成功
pMyBlock-> pNext = Pblockの。
Pblockの= pMyBlock。
リターン(void *型)pMyBlock-> ADATA。
}
}
}
ボイドのない(void *型pFree){
裁判所未満<< "relese部屋\ n" は、
//検索用メモリ
メモリブロック<_T> * pMyBlock = Pblockの。
メモリブロック<_T> * preBlock = nullptr;
一方、(pMyBlock!= nullptr &&(pBlock-> ADATA> pFree || pMyBlock-> A-DATA + pMyBlock-> nsizeの場合)){
preBlock = pMyBlock。
pMyBlock = pMyBlock->次。
}
//
もし(pMyBlock!= nullptr){
//配列のリストを変更します
*((uint16_t *)pFree)= pMyBlock-> nFirst。
pMyBlock-> nFirst =(uint16_t)((のuint32_t)pFree - (のuint32_t)pMyBlock-> A-DATA)/ nUnitSize。
pMyBlock-> nFree ++;
OSにメモリを解放する//必要性
IF(pMyBlock-> nsizeの== pMyBlock-> nFree * nUnitSize){
//delete node
pMyBlockを削除します。
}
そうしないと {
//ブロックは最初のチームに挿入され、
preBlock = pMyBlock-> pNext。
pMyBlock-> pNext = nullptr;
Pblockの= pMyBlock。
}
}
}
}。
クラスユーザー{
int型秒;
ダブルS1;
ダブルS3;
公衆:
ユーザ(INT X):S(X){
裁判所未満<<「*********************コールユーザーコンストラクタ\ n」は、
}
int型のget()constは{リターンの。}。
〜ユーザー(){
裁判所未満<<「************************コール・ユーザー・デストラクタ\ n」は、
}
}。
INTメイン(){
メモリプール<ユーザー>プール。
ユーザー* DP1 =(ユーザー*)pool.allocate(1)。
裁判所未満<< "DP1 =" << DP1 <<てendl;
新しい(DP1)ユーザ(1111);
coutの<< << dp1-> GET()<<てendl "オブジェクトの値があります"。
ユーザー* DP2 =(ユーザー*)pool.allocate(1)。
裁判所未満<< "DP2 =" << DP2 <<てendl;
新しい(DP2)ユーザ(2222);
coutの<< << dp2-> GET()<<てendl "オブジェクトの値があります"。
ユーザー* DP3 =(ユーザー*)pool.allocate(1)。
裁判所未満<< "DP3 =" << DP3 <<てendl;
新しい(DP3)ユーザ(3333);
coutの<< << dp3-> GET()<<てendl "オブジェクトの値があります"。
ユーザー* DP4 =(ユーザー*)pool.allocate(1)。
裁判所未満<< "DP4 =" << DP4 <<てendl;
新しい(DP4)ユーザ(4444);
coutの<< << dp4-> GET()<<てendl "オブジェクトの値があります"。
ユーザー* DP5 =(ユーザー*)pool.allocate(1)。
裁判所未満<< "DP5 =" << DP5 <<てendl;
新しい(DP5)ユーザ(5555);
coutの<< << dp5-> GET()<<てendl "オブジェクトの値があります"。
0を返します。
}