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

            頂小琪琪
              回復  更多評論    
            亚洲精品乱码久久久久久中文字幕 | 无码人妻少妇久久中文字幕蜜桃| 国产免费久久精品99re丫y| 亚洲国产精品一区二区久久hs | 久久久久久亚洲精品成人| 久久美女人爽女人爽| 国产精品成人久久久| 成人精品一区二区久久久| 久久久一本精品99久久精品88| 99久久人妻无码精品系列| 久久伊人五月天论坛| 91视频国产91久久久| 麻豆av久久av盛宴av| 美女写真久久影院| 久久丫精品国产亚洲av不卡| 久久se精品一区精品二区国产| 久久久亚洲欧洲日产国码aⅴ| 久久国产成人亚洲精品影院| 无码伊人66久久大杳蕉网站谷歌 | 久久99精品久久久久久水蜜桃| 久久人妻少妇嫩草AV无码专区| 伊人色综合久久天天网| 99久久成人18免费网站| 国产精品视频久久久| 久久综合狠狠综合久久| 伊人久久大香线蕉av一区| 国产精品99久久久精品无码| 久久强奷乱码老熟女网站| 国产精品gz久久久| 91精品国产高清久久久久久国产嫩草| 久久久久无码精品国产| 久久人人爽人人爽人人av东京热| 久久无码AV中文出轨人妻| 久久国产成人午夜AV影院| 久久成人精品| 久久这里都是精品| 中文字幕日本人妻久久久免费 | 青青草原综合久久大伊人导航| 久久五月精品中文字幕| 久久笫一福利免费导航| 少妇无套内谢久久久久|