• <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年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            統計

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

            頂小琪琪
              回復  更多評論    
            久久国产精品久久国产精品| 欧美精品久久久久久久自慰| 精品久久人妻av中文字幕| 久久66热人妻偷产精品9| 99999久久久久久亚洲| 精品久久国产一区二区三区香蕉| 久久国产精品-久久精品| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲国产精品无码久久九九| 合区精品久久久中文字幕一区| 国产成年无码久久久免费| 国产成人精品久久二区二区| 久久久久久av无码免费看大片| 亚洲精品无码久久毛片| 久久99精品久久久久久久久久| 91久久精品国产成人久久| 97视频久久久| 亚洲国产精品久久久久婷婷软件| 亚洲欧美成人久久综合中文网 | 亚洲国产成人久久综合区| 国产精品美女久久久m| 久久久久国产精品三级网| 国产精品久久久久9999| 久久福利资源国产精品999| 99久久精品费精品国产| 色综合久久无码中文字幕| 亚洲国产成人精品女人久久久| 久久综合中文字幕| 国产高潮国产高潮久久久| 狠狠色丁香婷婷久久综合| 久久成人18免费网站| 国产精品一久久香蕉产线看 | 国产精品久久久久久五月尺| 精品久久一区二区三区| 久久精品亚洲一区二区三区浴池| 色8激情欧美成人久久综合电| 国产精品成人无码久久久久久| 国产精品欧美久久久天天影视| 国内精品久久久久久99| 亚洲欧美伊人久久综合一区二区 | 亚洲精品国精品久久99热|