• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

               C++ 技術中心

               :: 首頁 :: 聯系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            話說一直想找一個別人寫好的使用,可惜沒什么人會拿這小東西發布,只好自寫一個。

            1.多級鏈表分配池
            我不知道這種設計的具體學名是什么,這部分的內容也許你去看《STL源碼分析》的有關章節更合適一些,這里我只能用我粗陋的語言描述一下。
            內存池,完全可以從字面上理解為從池子里申請內存,釋放的時候還給池子。
            最簡單的內存池應該是fix_pool吧,即每次分配出來的內存塊大小是固定的。這種池子的管理結構是一個鏈表,鏈表的每一個節點為固定大小的內存塊。分配的時候,直接返回鏈表的第一個節點,節點不足時,從系統申請大塊內存分成多個節點加入鏈表;釋放的時候更簡單,將釋放的內存加入鏈表頭。
            假設fix_pool的fix size = 128,那么內存池可以為128byte以下的任意大小的請求進行分配,但是這樣做相當浪費呢,于是unfix_pool就在此基礎上出現了。
            由多個分配大小不同的fix_pool所組成的內存池就叫做多級鏈表分配池,我是這么定義的。
            常規上會定義8,16,24,32,...,112,120,128這些分配大小,共16級。分配或者釋放的時候,判斷請求的大小在哪一級別上,用該級別的fix_pool鏈表進行分配或者釋放。


            2.泄漏檢測
            當所有的分配都經過你的手的時候,泄漏檢測什么的再簡單不過了。
            找個地方把分配的東西記錄下來,釋放的時候把記錄去掉。程序退出的時候還存在的分配記錄就是泄漏了。
            我個人選用的方法是給每一個分配請求多分配一些內存,用來記錄分配的信息,并將這部分信息用雙向鏈表串起來。釋放的時候對釋放的指針做一下指針偏移就可以找到信息記錄并移出雙向鏈表。
            這個方法的開銷是常數級的,不過無法處理重復刪除的問題。


            3.operater new
            要把你的內存池應用到每一個角落,需要定義operator new和operator delete。
            void* operator new(size_t) throw(std::bad_alloc);
            void operator delete(void* p);
            但是這還不夠,誰也不想看到一堆泄漏信息而找不到泄漏的位置,因此還需要定義帶附加參數的operator。
            對于placement new而言,operator new[]和operator delete[]是必須的,無法省略。

            void* operator new(size_t, const char* file, int line, const char* function);
            void* operator new[](size_t, const char*, int, const char*);
            void operator delete(void* p);
            void operator delete[](void* p);
            為了能用上新的operator,需要在頭文件中重新定義new,并包含進每一個cpp文件。

            //op_new.h
            #define DEBUG_NEW new(__FILE__, __LINE__, __FUNCTION__)
            #define new DEBUG_new
            不過重定義new會和自行使用placement new的地方沖突,如stl容器庫,這時候要undef new后才能編譯沖突組件。

            #undef new
            #include
            <vector>
            #include
            "op_new.h"


            4.線程安全
            我沒聽說過new/delete,malloc/free是線程不安全的,所以在內存池的allocate/deallocate接口處直接加了鎖。
            想降低開銷的同學可以使用spin lock,而不是mutex。

            posted on 2013-03-16 12:43 C++技術中心 閱讀(2789) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎

            Feedback

            # re: 內存池實現 (思路)[未登錄] 2013-03-16 13:35 Jcily
            nedmalloc  回復  更多評論
              

            欧美激情精品久久久久久| 久久99国产精一区二区三区| 蜜臀久久99精品久久久久久| 亚洲Av无码国产情品久久| 丁香色欲久久久久久综合网| 成人久久精品一区二区三区| 久久av高潮av无码av喷吹| 国内精品伊人久久久久777| 久久99国产精品久久99果冻传媒| 久久精品18| 久久精品a亚洲国产v高清不卡| 日本三级久久网| 中文字幕日本人妻久久久免费| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 久久久亚洲裙底偷窥综合| 狠色狠色狠狠色综合久久| 中文字幕无码久久人妻| 一本大道加勒比久久综合| 色偷偷88888欧美精品久久久| 久久久久亚洲AV综合波多野结衣| 蜜臀久久99精品久久久久久小说| 麻豆久久| 久久精品无码av| 久久国产乱子精品免费女| 久久人人妻人人爽人人爽| 久久99热这里只频精品6| 欧美麻豆久久久久久中文| 日本精品久久久中文字幕| 久久精品国产99国产精品澳门| 中文字幕无码精品亚洲资源网久久| 久久久久无码专区亚洲av| 色综合久久天天综合| 国产成人99久久亚洲综合精品 | 97精品久久天干天天天按摩| 伊人久久大香线蕉av一区| 一级女性全黄久久生活片免费| 久久久久97国产精华液好用吗| 品成人欧美大片久久国产欧美| 激情综合色综合久久综合| 国产高清美女一级a毛片久久w| 99久久精品免费看国产|