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

            頂小琪琪
              回復  更多評論    
            99久久精品国产一区二区蜜芽| 国产99久久九九精品无码| 精品乱码久久久久久夜夜嗨| 亚洲精品高清国产一久久| 国产成人久久精品二区三区| 国内精品久久久久久久久电影网| 久久五月精品中文字幕| 蜜桃麻豆WWW久久囤产精品| 久久综合给合久久狠狠狠97色| 久久er热视频在这里精品| 亚洲性久久久影院| 国产精品久久久亚洲| 久久精品国产只有精品66 | 久久久精品国产sm调教网站 | 久久精品国产亚洲αv忘忧草| 日韩欧美亚洲综合久久| 国产午夜久久影院| 久久久黄色大片| 国内精品久久久久影院一蜜桃| 久久人人爽人人爽人人片AV东京热| 久久精品国产亚洲AV香蕉| 久久精品草草草| 色综合久久无码中文字幕| 久久国产福利免费| 久久AV高清无码| 中文字幕无码精品亚洲资源网久久| 91亚洲国产成人久久精品| 久久九九精品99国产精品| 久久久久久亚洲精品无码| 久久久久免费精品国产| 天天躁日日躁狠狠久久| 四虎久久影院| 久久最新免费视频| 国产福利电影一区二区三区,免费久久久久久久精 | 成人精品一区二区久久久| av无码久久久久不卡免费网站 | 精品久久久久久无码人妻热 | 久久久久亚洲AV无码专区首JN | 亚洲AV伊人久久青青草原| 99热热久久这里只有精品68| 一本久久a久久精品综合夜夜 |