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

            大漠落日

            while(!dead) study++;
            posts - 46, comments - 126, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            內(nèi)存管理之引用計數(shù)

            Posted on 2010-07-23 10:27 亂78糟 閱讀(5832) 評論(0)  編輯 收藏 引用 所屬分類: C語言派系
            一、什么是引用計數(shù)?
              
            引用計數(shù)是內(nèi)存管理的一個技巧,可以看做是一種簡單的垃圾回收機(jī)制,它允許多個擁有共同值的對象共享同一個對象。

            二、為什么采用它?
              
            對于沒有垃圾自動回收機(jī)制的語言(如C/C++)和技術(shù)(如COM)來說,引用計數(shù)提供了一種簡潔高效的內(nèi)存管理方法。
            • 它簡化了跟蹤處理堆中對象的過程
                 
            一個對象被從堆中分配出來之后,我們需要明確的知道是誰擁有了這個對象,因為只有擁有這個對象的所有者能夠銷毀它。但我們在實際使用過程中, 這個對象可能被傳遞給另一個對象(例如通過傳遞指針參數(shù)),一旦這個過程復(fù)雜,我們很難確定誰最后擁有了這個對象。
                 使用引用計數(shù)就可以拋開這個問題,我們不需要再去關(guān)心誰擁有了這個對象,因為我們把管理權(quán)交割給了對象自己(這有點類似__stdcall和__cdecl兩種函數(shù)調(diào)用約定)。當(dāng)這個對象不再被任何人使用時,它自己負(fù)責(zé)銷毀自己。
            • 簡單并且高效
                
            簡單是特定時候增減一下對象的引用計數(shù)就可以了。高效是讓多個具有相同值的對象共享同一個對象,省卻了拷貝復(fù)值的過程,而且更加節(jié)省內(nèi)存和寶貴的CPU時間。

            三、誰都在使用它?
              
            現(xiàn)在很多技術(shù)和編程語言都在使用它,如COM,Object-C等,如果我們愿意,我們可以在自己的程序中使用它。
            • COM
               
            IUnknow提供了三個接口:QueryInterface、AddRef、Release。后面兩個分別用來增減和減少通過QueryInterface獲取的接口對象的引用計數(shù),當(dāng)內(nèi)部的計數(shù)為0時,接口對象自動銷毀自身。
            • COM的宿主DLL
               
            這種類型的DLL包含四個導(dǎo)出函數(shù):DLLRegisterServer、DLLUnregisterServer、DLLGetClassObject、DLLCanUnloadNoew。最后一個函數(shù)就是通過查看DLL維護(hù)的組件的計數(shù)值來決定這個DLL是否可以被CoFreeUnusedLibraries卸載掉。
            • Object-C
               
            Object-C作為C的派生語言,它的內(nèi)存管理徹底的采用了這個技巧。它的Foundation框架提供了是哪個方法:autoreleae、retain、release。第一個是將一個對象交由自動釋放池管理,其實是自動調(diào)用了release;后面兩個和COM中的最后兩個是相同的,分別用來增加和減少引用計數(shù)。

            四、我該如何實現(xiàn)它?
              
            下面我給出一個很簡單的例子,演示如何實現(xiàn)引用計數(shù)。
              
            class Foo{
            public:
                Foo(){
                    _ref 
            = 1;//構(gòu)造成功之后計數(shù)即為1
                }
                
            //輔助,用來打印引用計數(shù)
                void Print(){  
                    std::cout 
            << "_ref = " << _ref << std::endl;
                }
            public:
                
            //增加引用計數(shù)
                ULONG AddRef(){
                    
            return InterlockedIncrement(&_ref);
                }
                
            //減少引用計數(shù)
                ULONG Release(){
                    
            if (0 == InterlockedDecrement(&_ref)){
                        delete 
            this;
                        
            return 0;
                    }
                    
            return _ref;
                }
            private:
                
            long _ref;
            };

            int main(int argc, char *argv[])
            {
                Foo 
            * foo = new Foo;
                foo
            ->Print();//輸出:_ref = 1
                foo->Release();
                foo
            ->Print();//輸出:_ref = 隨機(jī)數(shù)字

                
            return 0;
            }

            PS: 這里是云風(fēng)寫的一篇文章《引用計數(shù)與垃圾回收之比較》,我認(rèn)為寫的非常好。
            久久一区二区免费播放| 久久午夜综合久久| 久久无码人妻一区二区三区午夜 | 国产精品欧美久久久天天影视| 久久美女网站免费| 精品99久久aaa一级毛片| 久久99热只有频精品8| 亚洲精品国产美女久久久| 久久天天婷婷五月俺也去| 狠狠色伊人久久精品综合网| 久久精品成人欧美大片| 国产精品99精品久久免费| 久久久久女人精品毛片| 久久青青草原亚洲av无码app| 久久精品免费一区二区| 99久久免费国产特黄| 亚洲中文字幕伊人久久无码| 国产亚洲精久久久久久无码| 狠狠久久综合| 欧美伊香蕉久久综合类网站| 色播久久人人爽人人爽人人片aV| 欧美精品国产综合久久| 国产精品日韩欧美久久综合| 色婷婷综合久久久久中文一区二区 | 久久天堂电影网| 国产亚洲精品美女久久久| 久久综合香蕉国产蜜臀AV| 久久成人小视频| 亚洲精品国产自在久久| 久久久久久噜噜精品免费直播| 久久人人爽人人爽人人片AV不| 亚洲人成无码www久久久| 久久97精品久久久久久久不卡| 国产精品青草久久久久婷婷 | 国内精品久久久久| 久久国产精品波多野结衣AV | 久久精品国产2020| 欧美亚洲国产精品久久蜜芽| 偷窥少妇久久久久久久久| 成人资源影音先锋久久资源网| 久久人妻AV中文字幕|