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

            孔雀開發小屋

            專注并致力于手機客戶端開發
            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統計

            • 隨筆 - 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 孔雀 閱讀(11599) 評論(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

            頂小琪琪
              回復  更多評論    
            久久97久久97精品免视看| 久久久久亚洲av毛片大| 91久久精一区二区三区大全| 国产精品一区二区久久| 亚洲国产精品无码久久青草| 久久综合给久久狠狠97色| 91亚洲国产成人久久精品| 色播久久人人爽人人爽人人片AV| 国产午夜精品久久久久免费视 | 伊人久久无码精品中文字幕| 久久久久亚洲AV无码麻豆| 久久人人爽人爽人人爽av| 国产成人精品久久一区二区三区 | 精品综合久久久久久888蜜芽| 久久精品二区| 久久夜色精品国产亚洲| 久久久精品人妻一区二区三区四| 亚洲欧美国产精品专区久久| 国产一区二区精品久久凹凸| 久久精品国产免费一区| 精品蜜臀久久久久99网站| 囯产精品久久久久久久久蜜桃| 久久国产精品国语对白| 国内精品久久久久久久涩爱| 精品国产91久久久久久久| 国产精品无码久久久久久| 亚洲中文久久精品无码ww16| 狠狠色丁香久久婷婷综合_中| 久久久久久久综合日本| 久久久精品久久久久久| 久久久国产一区二区三区| 久久久99精品成人片中文字幕 | 91久久精品91久久性色| 亚洲狠狠婷婷综合久久久久| 18岁日韩内射颜射午夜久久成人| 久久综合亚洲色HEZYO社区| 久久天天躁夜夜躁狠狠躁2022| 国内高清久久久久久| 精品国产一区二区三区久久久狼| 国产精品对白刺激久久久| 久久亚洲国产精品一区二区|