• <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>
            最近嘗試寫一些基本的C++泛型組件,其實(shí)很多都是boost里已經(jīng)有了,但是還是喜歡自己再寫一下, 原因有三:
            1. boost太龐大,拿來學(xué)習(xí)不錯(cuò),但是一般不會(huì)直接在項(xiàng)目中把它import進(jìn)來。
            2. C++11也挺不錯(cuò),但是現(xiàn)在工作還是以VS2008為主,所以這些新特性暫時(shí)用不上。
            3. 重復(fù)造輪子才能更好的理解輪子背后的原理,以后才能更好的操作輪子。

            看一些庫時(shí)發(fā)現(xiàn)僅指針一項(xiàng)就有挺多封裝, 思考為什么需要智能指針?
            通過智能指針可以以RAII的方式管理對象, 編寫異常安全的代碼; 原始的指針沒有標(biāo)明對象所有權(quán)的情況, 對象是你單獨(dú)擁有的?還是你和別人共享對象, 但是你也參與管理? 還是你只是使用對象,但是沒有所有權(quán)? 智能指針很好的解決了這些問題。

            下面是一些常見的智能指針封裝形式:

            std::auto_ptr
            基于所有權(quán)的智能指針,每次賦值或是拷貝構(gòu)造都是所有權(quán)的轉(zhuǎn)移,所以不能放到標(biāo)準(zhǔn)容器中。

            unique_ptr
            同樣是基于所有權(quán)的智能指針,不支持賦值或是拷貝構(gòu)造,但是因?yàn)镃++11 Move語義和右值引用的支持,可以通過Move的方法放置到容器中。

            proxy_ptr
            僅是原始指針的封裝代理,和普通指針沒有什么區(qū)別, 不參與對象生命周期的管理。

            ref_ptr (intrusive_ptr)
            入侵式的引用計(jì)數(shù)智能指針,對象本身具有引用計(jì)數(shù)功能, 外部指針通過對象的引用計(jì)數(shù)管理該對象的生命周期。很多框架和庫都是基于這種方式, 典型COM組件開發(fā)中的CComPtr就是這種類型的指針。

            shared_ptr
            非入侵式的引用計(jì)數(shù)智能指針,對象本身不需要計(jì)數(shù)功能,外部指針在創(chuàng)建對象時(shí)會(huì)自己創(chuàng)建計(jì)數(shù)功能并與對象綁定。這種方式使用起來非常方便,但是如果使用不當(dāng)也會(huì)有很多問題, 具體參見shared_ptr四宗罪

            weak_ptr
            一般配合share_ptr一起使用, 因?yàn)閣eak_ptr本身不參與對象引用計(jì)數(shù)的管理,但是它能查詢所引用的對象是否還有效, 所以通過weak_ptr可以解決循環(huán)引用的問題。

            在寫泛型代碼的過程中,會(huì)有對程序失去控制的感覺,比如下面的代碼:
            //C++ 11
            class
             bigclass {};

            void fun(bigclass& b){}

            int main()
            {
               bigclass c;
               std::thread t(&fun, c);
               t.join();

               return 0;
            }
            你知道上面的c對象被拷貝了多少次嗎? 如果改成std::ref(c)后呢?

            我們用C寫代碼時(shí)可以明確知道每行代碼最終匯編執(zhí)行時(shí)的情況。
            用經(jīng)典C++(面向?qū)ο?寫代碼時(shí), 如果C++基礎(chǔ)扎實(shí),也可以大概知道背后的匯編代碼, 無非是多些構(gòu)造,拷貝,賦值,析構(gòu),多態(tài)等。
            但是用現(xiàn)代C++(面向?qū)ο?泛型), 你卻很難知道最終展開后的匯編代碼情況, 因?yàn)榉盒团c對方傳的類型密切相關(guān), 可能你一不小心,對象就被拷貝了N多份,而你還渾然不知。

            越抽象的東西離底層機(jī)器就越遙遠(yuǎn), C++隔著復(fù)雜的編譯器, Java/C#隔著虛擬機(jī), 腳本語言隔著解釋器, 這就是高級語言的代價(jià)。

            看一些開源的東西,越來越覺得博客沒啥好寫了,基礎(chǔ)的東西大家都懂, 高級的東西我也不懂,不知道以前為什么有勇氣寫這么多東西 ^_^
            附上最近模仿的一點(diǎn)東西: MySLib
            posted on 2013-06-20 22:38 Richard Wei 閱讀(3338) 評論(3)  編輯 收藏 引用 所屬分類: STL&GP

            FeedBack:
            # re: 智能指針與庫
            2013-06-22 22:12 | cao
            看一些開源的東西,越來越覺得博客沒啥好寫了,基礎(chǔ)的東西大家都懂, 高級的東西我也不懂,不知道以前為什么有勇氣寫這么多東西 ^_^

            就是學(xué)生課堂作業(yè)和專家著書的區(qū)別
            博主要進(jìn)入著書立說的的階段了  回復(fù)  更多評論
              
            # re: 智能指針與庫
            2013-06-23 20:18 | Richard Wei
            @cao
            慚愧,不敢誤人子弟。  回復(fù)  更多評論
              
            # re: 智能指針與庫
            2013-06-25 16:56 | tb
            需要學(xué)習(xí)的東西太多了  回復(fù)  更多評論
              
            久久久这里只有精品加勒比| 久久精品国产亚洲AV嫖农村妇女| 婷婷久久香蕉五月综合加勒比| 一日本道伊人久久综合影| 久久精品亚洲日本波多野结衣| 久久久噜噜噜www成人网| 久久99国产亚洲高清观看首页| 91性高湖久久久久| 日韩人妻无码精品久久久不卡 | 久久婷婷色综合一区二区| 99精品国产免费久久久久久下载| 影音先锋女人AV鲁色资源网久久| 久久国产免费观看精品3| 欧美久久一级内射wwwwww.| 国产精品禁18久久久夂久| 亚洲Av无码国产情品久久| 国内精品久久久久| 亚洲va久久久噜噜噜久久| 久久久久国色AV免费看图片| 91精品国产高清久久久久久io| 亚洲国产香蕉人人爽成AV片久久 | 久久国产香蕉一区精品| 久久精品国产亚洲精品2020| 狠狠色丁香婷婷久久综合五月 | 久久99热精品| 久久久久人妻一区二区三区vr| 久久精品国产99久久香蕉| 9999国产精品欧美久久久久久| 99久久综合国产精品免费| 久久只有这精品99| 久久精品二区| 亚洲人成无码网站久久99热国产 | 久久精品国产福利国产琪琪| 亚洲综合精品香蕉久久网97| 久久精品国产免费一区| 99久久精品国产一区二区| 欧美久久综合性欧美| 久久免费精品一区二区| a级毛片无码兔费真人久久| 国产福利电影一区二区三区,免费久久久久久久精| 亚洲综合熟女久久久30p|