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

            孔雀開發小屋

            專注并致力于手機客戶端開發
            <2010年7月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            • 隨筆 - 103
            • 文章 - 0
            • 評論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關注的博客

            朋友的博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            Placement new的用法及用途
            什么是placement new?

            所謂placement new就是在用戶指定的內存位置上構建新的對象,這個構建過程不需要額外分配內存,只需要調用對象的構造函數即可。
            舉例來說:
            class foo{};
            foo* pfoo = new foo;
            pfoo指向的對象的地址你是不能決定的,因為new已經為你做了這些工作。第一步分配內存,第二步調用類的構造函數。
            而placement new是怎么做的呢,說白了就是把原本new做的兩步工作分開來。第一步你自己分配內存,第二步你調用類的構造函數在自己分配的內存上構建新的對象。


            placement new的好處:
            1)在已分配好的內存上進行對象的構建,構建速度快。
            2)已分配好的內存可以反復利用,有效的避免內存碎片問題。

            關于Placement new的標準用法,網上有一篇文章講得很清楚,我這里再轉述一下。

            class Foo
            {
                
            char cc;
                
            float f;

            public:
                
            void print() { std::cout << "ADDR: " << this << std::endl; }
                
            void set_f( float _f ) { std::cout << "set f val : " << _f << std::endl; f = _f; }
                
            void get_f() { std::cout << "get f val : " << f << std::endl; }
            };

            1)分配內存
            char* buff = new charsizeof(Foo) * N ];
            memset( buff, 
            0sizeof(Foo)*N );

            2)構建對象
            Foo* pfoo = new (buff)Foo;

            3)使用對象
            pfoo->print();

            pfoo
            ->set_f(1.0f);
            pfoo
            ->get_f();

            4)析構對象,顯式的調用類的析構函數。
            pfoo->~Foo();

            5)銷毀內存
            delete [] buff;

            上面5個步驟是標準的placement new的使用方法。

            對于buff這塊內存可以反復使用,只要重復2)、3)、4)步驟即可。

            placement new還可以解決的一個問題是建立帶參數的構造函數對象數組。
            代碼示例如下:
             1 class CPong
             2 {
             3 public:
             4     CPong( int m ) : v(m) { std::cout << "CPong ctor." << std::endl; }
             5 
             6 private:
             7     int v;
             8 };
             9 char* pong = new charsizeof(CPong) * 10 ];
            10 CPong* pp = (CPong*)pong;
            11 
            12 for ( int i=0; i<10++i )
            13 {
            14     new (pp+i)CPong(i);
            15 }
            16 
            17 for ( int j=0; j<10++j )
            18 {
            19     pp[j].~CPong();
            20 }
            21 
            22 delete [] pong;


            posted on 2010-02-20 14:20 孔雀 閱讀(11585) 評論(4)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # re: Placement new的用法及用途 2010-02-20 16:15 OwnWaterloo

            標準使用方法, 在第1步中應該只涉及內存分配行為, 比如使用operator new, operator new[], malloc。
            memset也是不必要的。
            在第5步中, 應該只涉及內存歸還行為, 比如使用operator delete, operator delete[], free。
              回復  更多評論    

            # re: Placement new的用法及用途 2010-02-20 17:06 孔雀

            @OwnWaterloo
            謝謝指教!
              回復  更多評論    

            # re: Placement new的用法及用途 2010-02-24 09:55 飛鴿傳書

            寫得挺好的。
              回復  更多評論    

            # re: Placement new的用法及用途 2010-11-10 11:06 RingOfTheC

            頂小琪琪
              回復  更多評論    
            久久国产精品一国产精品金尊| 老司机午夜网站国内精品久久久久久久久 | 国产精品欧美久久久久无广告 | 久久精品人成免费| 久久久久久久久无码精品亚洲日韩 | 91视频国产91久久久| 久久久久人妻精品一区三寸蜜桃| 亚洲精品成人久久久| 成人妇女免费播放久久久| 欧美午夜A∨大片久久| 丰满少妇高潮惨叫久久久| 久久精品成人免费观看97| 久久久无码一区二区三区 | 无码8090精品久久一区| 久久久婷婷五月亚洲97号色 | 久久99热这里只有精品66| www性久久久com| 久久亚洲中文字幕精品一区| 激情久久久久久久久久| 97精品国产91久久久久久| 久久WWW免费人成一看片| 欧美日韩精品久久久免费观看| 久久福利青草精品资源站| 久久偷看各类wc女厕嘘嘘| 午夜精品久久久内射近拍高清| 免费观看久久精彩视频| 久久精品亚洲精品国产色婷| 久久久久久久波多野结衣高潮| 色悠久久久久久久综合网| 国产—久久香蕉国产线看观看| 国产精品久久亚洲不卡动漫| 久久久噜噜噜www成人网| 亚洲AV日韩精品久久久久久久| 一本大道久久香蕉成人网| 久久亚洲精品国产亚洲老地址| 久久一区二区免费播放| 日日狠狠久久偷偷色综合96蜜桃| 久久精品国产WWW456C0M| 久久精品国产亚洲Aⅴ蜜臀色欲| 韩国三级中文字幕hd久久精品 | 久久青草国产精品一区|