メモリブロックとメモリプール

書式#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を返します。
}



おすすめ

転載: www.cnblogs.com/MasterYan576356467/p/12181530.html