• <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>

            CppExplore

            一切像霧像雨又像風(fēng)

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              29 隨筆 :: 0 文章 :: 280 評(píng)論 :: 0 Trackbacks

            作者:CppExplore 地址:http://www.shnenglu.com/CppExplore/
            (2)boost::pool
            系列。boost的內(nèi)存池最低層是simple_segregated_storage,類似于Loki中的chunk,在其中申請(qǐng)釋放block(boost中把block稱為chunk,暈死,這里還是稱其為block)采用了和loki的chunk中同樣的算法,不同的是simple_segregated_storage使用void*保存block的塊序號(hào),loki中使用char,因此boost中的simple_segregated_storage沒有255的上限限制,自然也就不需要再其上再封裝一層類似與FixedAllocator的層面。另boost沒有屏蔽塊的大小,直接提供定長的接口給用戶,省掉了SmallObjAllocator層面。因此boost的內(nèi)存池申請(qǐng)釋放block的時(shí)間復(fù)雜度都是O(1)(object_pool和pool_allocator除外),另避免的小內(nèi)存的浪費(fèi),同時(shí)boost不能象loki那樣在將block歸還給內(nèi)存池的時(shí)候根據(jù)chunk的空閑數(shù)量釋放內(nèi)存歸還給系統(tǒng),只能顯式調(diào)用釋放內(nèi)存函數(shù)或者等內(nèi)存池銷毀的時(shí)候,基本上和內(nèi)存池生命周期內(nèi)永不釋放沒什么區(qū)別。
                boost的最低層是simple_segregated_storage,主要算法和loki中的chunk一樣,不多說了。這里說下影響上層接口的兩類實(shí)現(xiàn):add_block/malloc/free、add_ordered_block/malloc/ordered_free,兩種低層實(shí)現(xiàn)造成boost上層設(shè)計(jì)的成功與失敗,前者效率高,和loki一樣直接增加釋放,時(shí)間復(fù)雜度O(1),后者掃描排序,時(shí)間復(fù)雜度O(n)。
                boost提供了四種內(nèi)存池模型供使用:pool、object_pool、singleton_pool、pool_allocator/fast_pool_allocator。
            1)pool
            基本的定長內(nèi)存池

            #include <boost/pool/pool.hpp>
            typedef struct student_st
            {
               
            char name[10];
               
            int age;
            }
            CStudent;
            int main()
            {
               boost::pool
            <> student_pool(sizeof(CStudent));
               CStudent 
            * const obj=(CStudent *)student_pool.malloc();
               student_pool.free(obj);
               
            return 0;
            }

                pool的模版參數(shù)只有一個(gè)分配子類型,boost提供了兩種default_user_allocator_new_delete/default_user_allocator_malloc_free,指明申請(qǐng)釋放內(nèi)存的時(shí)候使用new/delete,還是malloc/free,默認(rèn)是default_user_allocator_new_delete。構(gòu)造函數(shù)有2個(gè)參數(shù):nrequested_size,nnext_size。nrequested_size是block的大小(因?yàn)関oid*保存序號(hào),因此boost內(nèi)置了block的最小值,nrequested_size過小則取內(nèi)置值),nnext_size是simple_segregated_storage中內(nèi)存不足的時(shí)候,申請(qǐng)的block數(shù)量,默認(rèn)是32。最全面的實(shí)例化pool類似這樣:boost::pool<boost::default_user_allocator_malloc_free> student_pool(sizeof(CStudent),255);
                pool提供的函數(shù)主要有:
            malloc/free  基于add_block/malloc/free實(shí)現(xiàn),高效
            ordered_malloc/ordered_free 基于add_ordered_block/malloc/ordered_free實(shí)現(xiàn),在pool中無任何意義,切勿使用。
            release_memory/purge_memory 前者釋放池中未使用內(nèi)存,后者釋放池中所有內(nèi)存。另池析構(gòu)也會(huì)釋放內(nèi)存

            2)object_pool

            對(duì)象內(nèi)存池,這是最失敗的一個(gè)內(nèi)存池設(shè)計(jì)。

            #include <boost/pool/object_pool.hpp>

            class A{
            public:
               A():data_(
            0){}
            private:
               
            int data_;
            }
            ;
            int main()
            {
               boost::object_pool
            <A> obj_pool;
               A 
            *const pA=obj_pool.construct();
               obj_pool.destroy(pA);
               
            return 0;
            }

                object_pool繼承至pool,有兩個(gè)模版參數(shù),第一個(gè)就是對(duì)象類型,第二個(gè)是分配子類型,默認(rèn)同pool是default_user_allocator_new_delete。構(gòu)造函數(shù)參數(shù)只有nnext_size,意義以及默認(rèn)值同pool。最全面的實(shí)例化object_pool類似這樣:boost::pool<A,boost::default_user_allocator_malloc_free> obj_pool(255);
            object_pool提供的函數(shù)主要有(繼承至父類的略):
            malloc/free 復(fù)寫pool的malloc/free,add_ordered_block/malloc/ordered_free實(shí)現(xiàn)
            construct/destroy 基于本類的malloc/free實(shí)現(xiàn),額外調(diào)用默認(rèn)構(gòu)造函數(shù)和默認(rèn)析構(gòu)函數(shù)。
            ~object_pool 單獨(dú)拿出這個(gè)說下,若析構(gòu)的時(shí)候有對(duì)象未被destroy,可以檢測(cè)到,釋放內(nèi)存前對(duì)其執(zhí)行destroy
                為什么boost::object_pool要設(shè)計(jì)成這樣?能調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)顯然不是boost::object_pool類設(shè)計(jì)的出發(fā)點(diǎn),因?yàn)闃?gòu)造函數(shù)只能執(zhí)行默認(rèn)構(gòu)造函數(shù)(首次發(fā)表錯(cuò)誤:可以調(diào)用任意的構(gòu)造函數(shù),參見代碼文件:boost/pool/detail/pool_construct.inc和boost/pool/detail/pool_construct_simple.inc,感謝eXile指正),近似于無,它的重點(diǎn)是內(nèi)存釋放時(shí)候的清理工作,這個(gè)工作默認(rèn)的析構(gòu)函數(shù)就足夠了。apr_pool內(nèi)存池中就可以注冊(cè)內(nèi)存清理函數(shù),在釋放內(nèi)存的時(shí)刻執(zhí)行關(guān)閉文件描述符、關(guān)閉socket等操作。boost::object_pool也想實(shí)現(xiàn)同樣的功能,因此設(shè)計(jì)了destroy這個(gè)函數(shù),而同時(shí)為了防止用戶遺漏掉這個(gè)調(diào)用,而又在內(nèi)存池析構(gòu)的時(shí)候進(jìn)行了檢測(cè)回收。為了這個(gè)目的而又不至于析構(gòu)object_pool的時(shí)間復(fù)雜度是O(n平方),boost::object_pool付出了沉重的代價(jià),在每次的destoy都執(zhí)行排序功能,時(shí)間復(fù)雜度O(n),最后析構(gòu)的時(shí)間復(fù)雜度是O(n),同樣為了這個(gè)目的,從simple_segregated_storage增加了add_ordered_block/ordered_free,pool增加了ordered_malloc/ordered_free等累贅多余的功能。
                基于上面討論的原因,boost::object_pool被設(shè)計(jì)成了現(xiàn)在的樣子,成了一個(gè)雞肋類。類的設(shè)計(jì)者似乎忘記了內(nèi)存池使用的初衷,忘記了內(nèi)存池中內(nèi)存申請(qǐng)釋放的頻率很高,遠(yuǎn)遠(yuǎn)大于內(nèi)存池對(duì)象的析構(gòu)。如果你依然想使用類似于此的內(nèi)存清理功能,可以在boost::object_pool上修改,不復(fù)寫malloc/free即可,重寫object_pool的析構(gòu),簡單釋放內(nèi)存就好,因此析構(gòu)object_pool前不要忘記調(diào)用destroy,這也是使用placement new默認(rèn)遵守的規(guī)則,或者保持以前的析構(gòu)函數(shù),犧牲析構(gòu)時(shí)的性能。placement new的作用是為已經(jīng)申請(qǐng)好的內(nèi)存調(diào)用構(gòu)造函數(shù),使用流程為(1)申請(qǐng)內(nèi)存buf(2)調(diào)用placement new:new(buf)construtor()(3)調(diào)用析構(gòu)destructor()(4)釋放內(nèi)存buf。#include<new>可以使用placement new。
            3)singleton_pool
            pool的加鎖版本。

            #include <boost/pool/singleton_pool.hpp>
            typedef struct student_st
            {
               
            char name[10];
               
            int age;
            }
            CStudent;
            typedef struct singleton_pool_tag
            {}singleton_pool_tag;
            int main()
            {
               typedef boost::singleton_pool
            <singleton_pool_tag,sizeof(CStudent)>  global;
               CStudent 
            * const df=(CStudent *)global::malloc();
               global::free(df);
               
            return 0;
            }

                singleton_pool為單例類,是對(duì)pool的加鎖封裝,適用于多線程環(huán)境,其中所有函數(shù)都是靜態(tài)類型。它的模版參數(shù)有5個(gè),tag:標(biāo)記而已,無意義;RequestedSize:block的長度;UserAllocator:分配子,默認(rèn)還是default_user_allocator_new_delete;Mutex:鎖機(jī)制,默認(rèn)值最終依賴于系統(tǒng)環(huán)境,linux下是pthread_mutex,它是對(duì)pthread_mutex_t的封裝;NextSize:內(nèi)存不足的時(shí)候,申請(qǐng)的block數(shù)量,默認(rèn)是32。最全面的使用singleton_pool類似這樣:typedef boost::singleton_pool<singleton_pool_tag,sizeof(CStudent),default_user_allocator_new_delete,details::pool::default_mutex,200>  global;
                它暴露的函數(shù)和pool相同。
            4)pool_allocator/fast_pool_allocator
                stl::allocator的替換方案。兩者都是基于singleton_pool實(shí)現(xiàn),實(shí)現(xiàn)了stl::allocator要求的接口規(guī)范。兩者的使用相同,區(qū)別在于pool_allocator的實(shí)現(xiàn)調(diào)用ordered_malloc/ordered_free,fast_pool_allocator的實(shí)現(xiàn)調(diào)用malloc/free,因此推薦使用后者。

            #include <boost/pool/pool_alloc.hpp>
            #include 
            <vector>
            typedef struct student_st
            {
             
            char name[10];
             
            int age;
            }
            CStudent;

            int main()
            {
              std::vector
            <CStudent *,boost::fast_pool_allocator<CStudent *> > v(8);
              CStudent 
            *pObj=new CStudent();
              v[
            1]=pObj;
              boost::singleton_pool
            <boost::fast_pool_allocator_tag,sizeof(CStudent *)>::purge_memory(); 
              
            return 0;
            }

                fast_pool_allocator的模版參數(shù)有四個(gè):類型,分配子,鎖類型,內(nèi)存不足時(shí)的申請(qǐng)的block數(shù)量,后三者都有默認(rèn)值,不再說了。它使用的singleton_pool的tag是boost::fast_pool_allocator_tag。
            評(píng)價(jià):boost::pool小巧高效,多多使用,多線程環(huán)境下使用boost::singleton_pool,不要使用兩者的ordered_malloc/ordered_free函數(shù)。boost::object_pool不建議使用,可以改造后使用。pool_allocator/fast_pool_allocator推薦使用后者。


            未完 待續(xù).................... 不過這個(gè)主題暫時(shí)不寫了 等有時(shí)間了
            posted on 2008-02-20 15:09 cppexplore 閱讀(6716) 評(píng)論(21)  編輯 收藏 引用

            評(píng)論

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-20 19:07 空明流轉(zhuǎn)
            確實(shí),本來打算用obj_pool的,后來一看complexity,拉倒吧。。。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-20 23:15 eXile
            我覺得lz對(duì)object_pool 的設(shè)計(jì)理念和如何使用都存在理解上的錯(cuò)誤, 特別是以下幾點(diǎn):
            1) 構(gòu)造函數(shù)只能執(zhí)行默認(rèn)構(gòu)造函數(shù)
            2) 設(shè)計(jì)了destroy這個(gè)函數(shù),而同時(shí)為了防止用戶遺漏掉這個(gè)調(diào)用,而又在內(nèi)存池析構(gòu)的時(shí)候進(jìn)行了檢測(cè)回收
            3)為了這個(gè)目的而又不至于析構(gòu)object_pool的時(shí)間復(fù)雜度是O(n平方)


            object_pool 主要著眼于“自動(dòng)析構(gòu)”,在沒有g(shù)c的情況下,達(dá)到提高效率和自動(dòng)管理內(nèi)存的目的。而且它也特別適合于“多次申請(qǐng),一次釋放”的情況.所以它甚至是鼓勵(lì)你忽略使用destroy(從它的例子就可以看出來)。

            destroy函數(shù)并沒有提高復(fù)雜度,因?yàn)閮?nèi)部鏈表始終處于有序狀態(tài)(由于使用order_malloc,order_free),所以不論是逐個(gè)釋放,還是成批釋放,它的復(fù)雜度都是O(N)

              回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 09:08 cppexplore
            另:boost/pool下的6個(gè)hpp文件我是挨個(gè)讀過了。detail下的都很簡單,5個(gè)hpp,singleton.hpp有效行數(shù)就10幾行,沒看,想當(dāng)然了下。mutex和guard在讀singleton_pool.hpp的時(shí)候看了下linux下的mutex,順便還測(cè)試了下,gcd_lcm的兩個(gè)也很簡單,沒看,估計(jì)大約是2者求最小值的功能。
            我一貫認(rèn)為,明白原理,知道如何使用就好,深入具體細(xì)節(jié)就是浪費(fèi)腦細(xì)胞,如果你要實(shí)現(xiàn)一個(gè)當(dāng)然例外。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 10:29 cppexplore
            @eXile
            暈倒 在boost/pool/detail/pool_construct.inc里
            只關(guān)注hpp去了
            可以調(diào)用任意的構(gòu)造函數(shù)
            多謝指正!正文中現(xiàn)已標(biāo)明。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 10:48 eXile
            呵呵,不當(dāng)之處,敬請(qǐng)?jiān)彙?
            “多次申請(qǐng),一次釋放”的情況,比如說對(duì)于服務(wù)器而言,從收到一個(gè)包,到對(duì)這個(gè)包的處理完畢,則可視為內(nèi)存的一個(gè)周期。不過有時(shí)候異步完成,再加上object_pool只能管理一種對(duì)象,又限制了這種使用。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三)[未登錄] 2008-02-21 11:06 cppexplore
            @eXile
            :)
            “從收到一個(gè)包,到對(duì)這個(gè)包的處理完畢,則可視為內(nèi)存的一個(gè)周期。”,這時(shí)候析構(gòu)object_pool不恰當(dāng),因?yàn)橐院筮€會(huì)收到包,內(nèi)存還可循環(huán)被使用,這里還是應(yīng)該調(diào)用destroy,而它的時(shí)間復(fù)雜度o(n),導(dǎo)致了真是不太適合使用。析構(gòu)object_pool更不可取,時(shí)間復(fù)雜度不說,還有內(nèi)存的再次申請(qǐng),背離了內(nèi)存池的初衷。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 11:12 eXile
            這個(gè)倒不是問題,因?yàn)閛bject_pool是可配置的, 它帶有一個(gè)模板參數(shù)UserAlloc, 可以自定義  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三)[未登錄] 2008-02-21 11:28 cppexplore
            問題的關(guān)鍵不在UserAlloc,而是details::PODptr<size_type> 。除非你想在內(nèi)存池之上實(shí)現(xiàn)這個(gè)內(nèi)存池的UserAlloc(到底是先有雞還是先有蛋......),即便這樣,當(dāng)前的object_pool析構(gòu)最少也要付出o(n)的代價(jià)。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 11:50 eXile
            呵呵,正是如此,UserAlloc可以使用一個(gè)全局的boost::pool來實(shí)現(xiàn),所謂大pool套小pool, 不過如果object_pool設(shè)計(jì)時(shí)完全放棄destroy, 則可以取得更大的優(yōu)化。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三)[未登錄] 2008-02-21 11:52 cppexplore
            暈倒..........................  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 12:07 jazz
            好久之前開始用pool,不過一直不用object_pool當(dāng)時(shí)就看到order_mallc的o(n)復(fù)雜度。當(dāng)時(shí)一直沒想明白 為什么用object_pool中為什么申請(qǐng)內(nèi)存使用order_mallc來替代malloc。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 12:12 jazz
            memory pool 本來是為提高性能,但是object_pool對(duì)于destroy-o(n)的性能怎么能夠容忍?  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-02-21 14:02 空明流轉(zhuǎn)
            我本來就是小塊的分配釋放,而且只需要單線程就夠了,所以一開始的時(shí)候?qū)懥藗€(gè)自己的池,現(xiàn)在考慮用boost的環(huán)池替代。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】系統(tǒng)設(shè)計(jì)之 內(nèi)存管理(三) 2008-04-27 07:25 王貴陽
            非常好,仔細(xì)研究。  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三) 2009-04-04 18:30 yshuise
            object_pool設(shè)計(jì)成那樣的根本原因,就是還可以作為內(nèi)存池使用。不是真正的釋放內(nèi)存。所以,博主理解不對(duì)啊  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三)[未登錄] 2009-04-04 19:37 cppexplore
            @yshuise
            你確信你看懂它的實(shí)現(xiàn)了?  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三) 2011-08-10 11:57 sa
            既然是一個(gè)定長的pool,為何simple_segregated_storage還要拆分成那么多chunk干嗎,直接把所有的obj通過一個(gè)linklist串在一起不就行了?  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三)[未登錄] 2011-08-10 12:30 cppexplore
            @sa
            原因: 1) 和linklist相比更節(jié)省內(nèi)存 2)和linklist相比,申請(qǐng)/歸還內(nèi)存更快  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三)[未登錄] 2011-10-20 21:54 chipset
            看了三篇文章。不知道該說啥好,單CPU,DLMalloc足矣,其它我都不看好,最不看好用完最后一次性釋放的內(nèi)存池,原因不解釋。

            多CPU,ptmalloc3,或glib里的內(nèi)存管理器(以ptmalloc3為基礎(chǔ)的改進(jìn)),谷歌的TCMalloc,還有Free BSD的Jemalloc,以及Hoard。多CPU,碎片率低,好的線性加速比是關(guān)鍵,Jemalloc很強(qiáng)。TCMalloc看上去像個(gè)多CPU的自有列表內(nèi)存管理器,加速比也不錯(cuò),且有垃圾收集,但是啟動(dòng)速度跟啟動(dòng)Java虛擬機(jī)絕對(duì)有一拼...這些都是免費(fèi)的。至于那些要錢的,我懶得一提...  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三) 2011-12-16 12:21 cppexplore
            @chipset
            站在"造輪子"角度 / "使用輪子" 角度 /"選輪子"角度 看到的東西各有些不同.  回復(fù)  更多評(píng)論
              

            # re: 【原創(chuàng)】技術(shù)系列之 內(nèi)存管理(三)[未登錄] 2012-03-26 20:49 cexer
            我覺得boost::pool的ordered_malloc和ordered_free函數(shù)是有必要的,它們是作為ordered pool的接口部分而存在的,使用場(chǎng)景不一樣,和malloc和free是沒有可比性。

            boost::pool中有一個(gè)函數(shù)malloc_n用來申請(qǐng)幾塊連續(xù)的partition。一個(gè)block是以partition為粒度劃分,以單向鏈表鏈接起來,多次malloc/free的動(dòng)作之后,這些partition在鏈表中的邏輯順序和它們?cè)趦?nèi)存中的實(shí)際順序極有可能是不一致的,此時(shí)要得到連續(xù)的partition,必須要遍歷鏈表,找出在內(nèi)存中實(shí)際連續(xù)的partition,并將它們?cè)阪湵碇械捻樞蛞仓匦乱赃B續(xù)的順序鏈接,然后返回給調(diào)用者。

            如果將鏈表的順序與內(nèi)存中實(shí)際順序的不一致程度叫做它的無序度,顯然這個(gè)遍歷操作的耗費(fèi)的時(shí)間,和鏈表的無序度是成正比的。如果這種malloc_n的操作很頻繁,那么這種遍歷鏈表重新鏈接的操作會(huì)很費(fèi)時(shí)。

            這種頻繁申請(qǐng)多個(gè)連續(xù)partition的場(chǎng)景下正是使用ordered pool的地方,正如pool作者在代碼寫的注釋那樣:
            // Note: if you're allocating/deallocating n a lot, you should
            // be using an ordered pool.

            ordered pool內(nèi)部的所有partition鏈表無序度為0,即所有partition在內(nèi)存中的實(shí)際順序和它們?cè)阪湵碇械倪壿嬳樞蛲耆恢拢瑢?duì)于malloc_n這樣的請(qǐng)求,可以更快滿足。也因此boost::pool提供了ordered版本的操作接口,這組接口保證每次free之后鏈表的順序不會(huì)亂。

            不過,我個(gè)人覺得block以partition為粒度劃分是沒必要的,可以在收到請(qǐng)求的時(shí)候按實(shí)際需求劃分,盡力使整個(gè)塊保持連續(xù),可以極大地避免產(chǎn)生碎片,降低ordered_malloc的ordered_free的時(shí)間。

            當(dāng)然ordered_xxx函數(shù)不應(yīng)該和其它的函數(shù)混用,否則就是陪了夫人又折兵的買賣,即浪費(fèi)了ordered_xxx的時(shí)間,又無法得到更快malloc_n的好處。
              回復(fù)  更多評(píng)論
              


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99久久精品免费看国产免费| 久久国产欧美日韩精品| 久久久WWW成人免费毛片| 久久这里有精品| 品成人欧美大片久久国产欧美...| 久久婷婷五月综合色99啪ak| 久久国产热精品波多野结衣AV| 精品久久久久久无码中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 久久久久无码精品| 精品久久久久久国产| 狠狠色狠狠色综合久久 | 91精品国产高清91久久久久久| 久久人人爽人人爽人人片AV东京热| 亚洲国产精品无码久久98| 性做久久久久久久久老女人| 久久九九青青国产精品| 蜜臀av性久久久久蜜臀aⅴ| 波多野结衣久久| 亚洲国产日韩欧美综合久久| 久久99精品久久久久久9蜜桃| 久久精品国产半推半就| 久久精品午夜一区二区福利| 亚洲AV无码久久精品成人| 免费久久人人爽人人爽av| 亚洲欧美国产精品专区久久| 久久久久18| 老司机午夜网站国内精品久久久久久久久| 香港aa三级久久三级| 久久er国产精品免费观看2| 久久超碰97人人做人人爱| 人妻精品久久无码专区精东影业| 久久九九久精品国产免费直播| 一个色综合久久| 久久久久av无码免费网| 久久国产AVJUST麻豆| 97精品国产97久久久久久免费| 国内精品久久久久影院薰衣草| 亚洲国产欧洲综合997久久| 久久午夜伦鲁片免费无码| 国产亚洲综合久久系列|