• <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)為寫的非常好。
            国产精品无码久久四虎| 精品国产乱码久久久久久人妻| 久久精品国产亚洲av麻豆小说| 97久久超碰国产精品2021| 久久亚洲欧美日本精品| 无码乱码观看精品久久| 久久亚洲春色中文字幕久久久| 国产成人久久久精品二区三区| 亚洲国产成人精品女人久久久 | 久久久久久夜精品精品免费啦| 久久国产高清字幕中文| 久久亚洲AV永久无码精品| 久久午夜无码鲁丝片| 免费一级欧美大片久久网| 精品久久久久久久| 亚洲AV无码久久| 伊人热热久久原色播放www | 久久久艹| 久久精品国产精品青草| 久久亚洲国产成人精品性色| 深夜久久AAAAA级毛片免费看| 色综合久久综精品| av无码久久久久不卡免费网站| 久久综合亚洲色HEZYO社区| 久久国产精品免费一区二区三区| 久久精品国产亚洲精品2020| 久久久国产99久久国产一| 国产亚洲成人久久| 99久久夜色精品国产网站| 99久久无色码中文字幕| 久久国产亚洲高清观看| 人妻精品久久无码专区精东影业 | 亚洲精品乱码久久久久久| 久久久久亚洲av综合波多野结衣 | 伊人久久大香线蕉成人| 一本色道久久88综合日韩精品| 久久久艹| 三级三级久久三级久久 | 国产视频久久| 久久伊人亚洲AV无码网站| 日本欧美国产精品第一页久久|