• <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,記錄游戲開發過程的筆記和心得!

            定制自己的new 和 delete,讓對象在靜態塊上進行分配。

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

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

            可以通過運行結果分析:
                   1.  2個對象的地址一樣,內存值地址也是一樣,對象可以進行靜態塊上的分配。
                   2.  不會存在內存泄露。
                   3.  浪費空間,碎片產生。

            代碼如下 :
              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 ];       /// 靜態存儲塊
             23
             24class MyObjectMan
             25{
             26    /// 
             27    /// 構造函數  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 )                    /// 如果有空閑的列表,先從空閑列表中取出空間進行分配
             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++ ]; /// 返回空閑區間
             67        }

             68        else                                /// 如果沒有空閑區間
             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

            運行結果:
             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地址一樣,且內存中存儲方式也一樣。

            posted on 2009-08-16 19:47 expter 閱讀(2570) 評論(10)  編輯 收藏 引用 所屬分類: 其他學習筆記 、生活筆記 、算法與數據結構

            評論

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

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

            不過內存池在調試的時候倒是蠻有用的。  回復  更多評論   

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

            拜讀了。。。  回復  更多評論   

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

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

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

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

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

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

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

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

            而且這樣內存無疑會有巨大浪費,除非能動態配置大小.  回復  更多評論   

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

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

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

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

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

            啊按時打算的  回復  更多評論   

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

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

            久久国产福利免费| 国产成人无码精品久久久久免费| 日本三级久久网| 色综合久久综合中文综合网| 一本一道久久a久久精品综合| 大蕉久久伊人中文字幕| 97久久综合精品久久久综合| 久久亚洲精品成人AV| 亚洲精品乱码久久久久久蜜桃图片 | 久久播电影网| 久久免费小视频| 97久久精品无码一区二区| 久久99热只有频精品8| 久久精品国产亚洲av麻豆小说 | 人人狠狠综合久久亚洲婷婷| 国内精品伊人久久久久| 国产精品久久久久9999高清| 99精品国产在热久久| 久久最近最新中文字幕大全| 99久久精品免费| 老司机午夜网站国内精品久久久久久久久 | 伊人色综合久久天天人守人婷| 久久久高清免费视频| 亚洲精品无码久久一线| 久久精品国产亚洲av麻豆小说 | 久久精品免费一区二区三区| 超级碰久久免费公开视频| a级毛片无码兔费真人久久| 久久久受www免费人成| 狠狠色丁香久久婷婷综合图片| 2021国产精品久久精品| 久久久久亚洲AV无码网站| 久久综合综合久久狠狠狠97色88| 久久久中文字幕日本| 中文字幕人妻色偷偷久久| 国产精品久久久久无码av| 久久精品无码av| 日韩精品久久久肉伦网站| 亚洲乱亚洲乱淫久久| 狠狠色丁香婷婷久久综合五月| 精品久久久久久无码专区不卡|