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

            勤能補拙,Expter

            成都游戲Coder,記錄游戲開發(fā)過程的筆記和心得!

            定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。

                  一般常見的new和delete操作符,就意味著使用堆進(jìn)行內(nèi)存分配,使用new操作符是名為operator new的函數(shù)調(diào)用,且函數(shù)返回返回一個指向某塊內(nèi)存分配器分配內(nèi)存指針。
                  對于內(nèi)存的分配到底從哪兒來沒有任何限制,它可能來自一個特殊的堆,也可能來自一個靜態(tài)分配的塊,也可能來自一個標(biāo)準(zhǔn)容器內(nèi)部,也可能來自某個函數(shù)范圍的局部存儲區(qū)。而對于現(xiàn)在的各自軟件中主流內(nèi)存管理方式,一般通過內(nèi)存池的管理方式,它可能即包含靜態(tài)分配也同時包含動態(tài)分配。
                其實網(wǎng)上關(guān)于內(nèi)存池的設(shè)計很多,而本文主要簡單的實現(xiàn)是一個對象可以從一個靜態(tài)塊上進(jìn)行分配。
              

            設(shè)計思路
                    1.重載new 和delete,重寫自己的內(nèi)存分配方式。
                    2.分配一大塊靜態(tài)數(shù)據(jù),用于然后進(jìn)行對象的管理。
                    3.對于對象分配的空間,釋放后通過一個鏈表來控制。
                    4.每次對象分配先從空閑的鏈表中分配,然后在從靜態(tài)塊中分配,如果空間不足,跑出異常。
                    5.并不會出現(xiàn)因分配空間失敗,釋放,以及內(nèi)存泄露,所有的內(nèi)存都在靜態(tài)常量區(qū),在程序結(jié)束后自動釋放。 
                  

            可以通過運行結(jié)果分析:
                   1.  2個對象的地址一樣,內(nèi)存值地址也是一樣,對象可以進(jìn)行靜態(tài)塊上的分配。
                   2.  不會存在內(nèi)存泄露。
                   3.  浪費空間,碎片產(chǎn)生。

            代碼如下 :
              1#include <iostream>
              2#include <cstdlib>
              3using namespace std;
              4
              5class MyObjectMan;
              6
              7struct block
              8{
              9    enum { max = 1000 };
             10    
             11    union{
             12        char store[ 100 ];     /// 對于特定的對象,可以通過sizeof(Object);來避免浪費,
             13        block  *next;
             14    }
            ;
             15
             16    static block * free;
             17    static int num_used;
             18}
            ;
             19
             20block* block::free = NULL;            /// 空閑的列表
             21int  block::num_used = 0;
             22static block mem[ block::max ];       /// 靜態(tài)存儲塊
             23
             24class MyObjectMan
             25{
             26    /// 
             27    /// 構(gòu)造函數(shù)  Default constructor
             28    /// 

             29public:
             30    MyObjectMan( int _val , int _type): val(_val) , type(_type) 
             31    {
             32        std::cout <<" constructor  " << std::endl;
             33    }

             34
             35    ~MyObjectMan()
             36    {
             37        std::cout <<" disconstructor " << std::endl;
             38    }

             39
             40    void print()
             41    {
             42        std::cout << " val values  is  " <<  val 
             43                  << " type values is  " <<  type << std::endl;
             44    }

             45
             46    void OutAddress()
             47    {
             48        std::cout << " val values  is  " <<  &val 
             49                  << " type values is  " <<  &type << std::endl;
             50    }

             51    ///
             52    /// 重載new  delete  
             53    /// 

             54public:
             55    void * operator new ( size_t  t)        /// 分配空間
             56    {
             57        if ( block::free )                    /// 如果有空閑的列表,先從空閑列表中取出空間進(jìn)行分配
             58        {
             59            block *tmp = block::free;
             60            block::free= block::free->next;
             61
             62            return tmp;
             63        }

             64        else if ( block::num_used < block::max )
             65        {
             66            return &mem[ block::num_used++ ]; /// 返回空閑區(qū)間
             67        }

             68        else                                /// 如果沒有空閑區(qū)間
             69            throw 1;
             70    }

             71
             72    void operator delete( void  *p )        /// 添加到空閑的free list
             73    {
             74        static_cast<block * >(p)->next = block::free;  /// 采用的是鏈表的前插入
             75        block::free =  static_cast<block*>(p);
             76    }

             77
             78    /// 
             79    ///  var
             80    /// 

             81private:
             82    int val;
             83    int type;
             84
             85}
            ;
             86
             87int main()
             88{
             89    MyObjectMan *h1 = new MyObjectMan( 1 , 1);
             90    h1->print();
             91    h1->OutAddress();
             92    
             93    delete h1;
             94
             95
             96    MyObjectMan *h2 = new MyObjectMan( 2 , 2);
             97    h2->print();
             98    h2->OutAddress();
             99    delete h2;
            100    
            101

            運行結(jié)果:
             constructor
             val values  is  1 type values is  1
             val values  is  0041A170 type values is  0041A174
             disconstructor
             constructor
             val values  is  2 type values is  2
             val values  is  0041A170 type values is  0041A174
             disconstructor

            可以看出對象1,2地址一樣,且內(nèi)存中存儲方式也一樣。

            posted on 2009-08-16 19:47 expter 閱讀(2571) 評論(10)  編輯 收藏 引用 所屬分類: 其他學(xué)習(xí)筆記生活筆記算法與數(shù)據(jù)結(jié)構(gòu)

            評論

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-16 23:13 欲三更

            內(nèi)存池這個東西,除了在頻繁的申請和釋放小塊內(nèi)存的情況下以外,似乎也沒有多大效率優(yōu)勢吧。如果單單為了防治內(nèi)存泄漏啟用內(nèi)存池,會不會有點得不償失?而且對于服務(wù)類軟件,僅僅在軟件結(jié)束運行的時候成功釋放掉所有內(nèi)存這種防泄漏方式,是很不夠的,因為服務(wù)一般會運行很長時間。

            不過內(nèi)存池在調(diào)試的時候倒是蠻有用的。  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-16 23:19 月下飲者

            拜讀了。。。  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-16 23:39 expter

            @欲三更
            你說的對于服務(wù)類軟件,一般都會使用內(nèi)存池通過空間換取時間,而且分配方式一般會使用靜態(tài)分配和動態(tài)2種,所以軟件結(jié)束這種應(yīng)該是一般內(nèi)存池都有的。
            而我這里只是重寫new,delete,讓對象可以在靜態(tài)塊上進(jìn)行分配。  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-17 02:14 欲三更

            @expter
            你這個重載的new其實不就是個mempool么?只不過分配的空間大小是個常數(shù)而已。  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。[未登錄] 2009-08-17 08:59 expter

            @欲三更
            嗯。。
            哇 你那么晚還沒睡覺  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-17 10:41 absolute

            你能確保你的block一定適合任意大小的對象?
            char store[ 100 ];這個一定夠用?

            而且這樣內(nèi)存無疑會有巨大浪費,除非能動態(tài)配置大小.  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。[未登錄] 2009-08-17 23:25 欲三更

            @absolute
            呵呵,我又來了:P
            在只有debug使用的情況下,選個大差不差的常數(shù)就好了,狼不浪費其實也沒什么關(guān)系,我自己要是搞這種東西一般都是為了查查內(nèi)存泄露什么的  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。[未登錄] 2009-08-18 04:56 fox

            重載NEW唯一壞處是線程不安全。  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-19 14:42 12530彩鈴

            啊按時打算的  回復(fù)  更多評論   

            # re: 定制自己的new 和 delete,讓對象在靜態(tài)塊上進(jìn)行分配。 2009-08-22 14:36 陳s

            你的留言板在哪里!我已做好你的鏈接,有空去寫寫書啊!為了中國it業(yè)的共同發(fā)展!  回復(fù)  更多評論   

            中文精品久久久久人妻不卡| 久久精品一区二区三区不卡| 久久精品国产精品亚洲精品| 久久www免费人成看片| 久久精品国产亚洲麻豆| 久久综合色之久久综合| 久久精品国产福利国产秒| 亚洲国产成人精品久久久国产成人一区二区三区综 | 99久久超碰中文字幕伊人| 久久久久国产精品嫩草影院 | 久久免费大片| 国产91色综合久久免费分享| 99久久做夜夜爱天天做精品| 国产精品综合久久第一页| 人妻少妇久久中文字幕 | 97久久综合精品久久久综合| 中文字幕久久精品| 久久99精品久久久久久野外| 国产V亚洲V天堂无码久久久| 热99RE久久精品这里都是精品免费 | 久久久久久伊人高潮影院| 久久青青国产| 久久国产精品一区| 999久久久免费国产精品播放| 伊人久久大香线蕉综合影院首页| 久久久无码精品午夜| 久久精品中文字幕有码| 99久久精品费精品国产| 97久久精品人人澡人人爽| 97精品国产97久久久久久免费| 久久久久久久综合日本亚洲 | 久久婷婷是五月综合色狠狠| 亚洲精品成人网久久久久久| 久久久久久久久久久免费精品| 久久国产乱子伦精品免费午夜| 久久精品国产WWW456C0M| 久久se精品一区精品二区国产| 国产精品欧美亚洲韩国日本久久| 国产精品久久久久乳精品爆| 久久99精品久久久久久9蜜桃| 久久亚洲高清综合|