青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

鍵盤上的舞者

My Email: marckywu@gmail.com
隨筆 - 19, 文章 - 0, 評論 - 3, 引用 - 0
數據加載中……

Allocating Arrays Using Placement new (zz)

       An additional version of operator new enables you to construct an object or an array of objects at a predetermined memory position. This version is called placement new and has many useful applications, including building a custom-made memory pool or a garbage collector. Additionally, it can be used in mission-critical applications because there's no danger of allocation failure; the memory that's used by placement new has already been allocated. Placement new is also faster because the construction of an object on a preallocated buffer takes less time.

You already know how to use placement new to allocate a single object on a predetermined memory address. However, some programming tasks require the allocation of arrays on a predetermined memory address. Here's how you do it.

Placement new Overview

Mobile devices, embedded systems and custom garbage collectors are only a few instances of programming environments that may require placement new allocation of arrays. Before I discuss the details of such array allocations, let's remind ourselves briefly how scalar (i.e. non-array) placement new works.

The scalar version of placement new takes a user-supplied address on which it constructs a single object. Unlike the ordinary version of the new operator, placement new doesn't allocate storage for the object; it merely constructs the object on the memory address you provide:

#include <new> //required for using placement new
class Widget {
public:
    Widget();
    
virtual ~Widget
    
virtual void Draw();
};
char* buf=new char [sizeof (Widget)];//preallocate
Widget* widget= new(buf) Widget; //construct Widget on buf
widget->Draw(); //use Widget

To destroy widget you first have to invoke its destructor explicitly:

widget->~Widget(); //explicit destructor invocation

Next, reclaim the raw memory like this:

delete[] buf;

Array Allocation

Allocating arrays with placement new follows the same steps more or less, but you have to pay attention to additional nuances. Here is a step-by-step guide:

First, allocate a buffer large enough to hold an array of the desired type:

const int ARRSIZE = 15;
char * buf= new [sizeof(Widget)*ARRSIZE];

Don't be tempted to calculate the size manually; always use sizeof to ensure that the buffer is properly aligned and has the right size.

Next, construct an array of ARRSIZE objects on the buffer using placement new[] :

Widget* widgets=new(buf) Widget[ARRSIZE];//construct an array

You can now use the allocated array as usual:

for (int i=0; i<ARRSIZE; i++)
{
 widgets[i].Draw();
}
Make sure that your target class -- Widget in this example -- has a public default constructor. Otherwise, it would be impossible to create arrays thereof.

Destroying the Array

To destroy such an array allocated by placement new you have to call the destructor for each element explicitly:

int i=ARRSIZE;
while (i)
    widgets[
--i].~Widget();

The while -loop uses a descending order to preserve the canonical destruction order of C++ -- the object that was constructed last must be destroyed first. To comply with this requirement, the element with the highest index is destroyed first.

Finally, you release the raw memory on which the array resided by calling delete[] :

delete[] buf;

Performance Tuning

The array placement new has a potential performance problem: it initializes every element in the array unconditionally. If your app deals with large arrays, this isn't the most efficient way. In some apps only a portion of the array is actually used, and in other apps the elements are assigned a different value immediately after their construction. In these cases, you want to postpone, or even completely avoid, the automatic initialization of array elements. To avoid the initialization of placement new arrays, follow the following steps:

As before, begin with an allocation of a raw buffer with the appropriate size. This time however, use the global operator new instead of the new operator:

Widget * warr=
static_cast
<Widget*> (::operator new ( sizeof(Widget)* ARRSIZE));

The global operator new , very much like C's malloc() , merely allocates raw bytes of memory from the free-store, without initializing them. It returns void * rather than Widget* which is why you need to cast the result explicitly.

At this stage, warr is a pointer to raw memory. You can't access its elements because they haven't been initialized yet. To initialize individual elements, call placement new once more, for each element you want initialized:

void assign(Widget arr[], size_t & sz,  const Widget& init)
{
    
new (&arr[sz++]) Widget (init); //invoke copy ctor
}

assign() passes the address of an individual element to placement new which in turn invokes Widget 's copy constructor. The copy-constructor initializes that element with init . Using this technique, you can initialize elements selectively, leaving the rest of the array uninitialized.

To destroy such an array, invoke the destructor of every initialized object. Then call the global operator delete to reclaim the raw storage:

void destroy(Widget arr[], size_t & sz)
{
    
while (sz)
    {
        arr[
--sz].~Widget();//destroy all initialized elements
    }
     ::
operator delete (arr); //reclaim raw storage
}

Summary

The techniques I've presented here are bug prone. Therefore, they should be encapsulated in higher-level classes that hide the implementation details from users. These techniques aren't rarely-used as they might seem. STL allocators use them under the hood to avoid object initialization and minimize reallocations.



posted on 2009-08-13 00:48 Marcky 閱讀(379) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区久久| 亚洲欧美日韩一区在线观看| 亚洲国产精品久久精品怡红院 | 国产精品久久久久久av福利软件 | 国产精品露脸自拍| 国产精品二区影院| 亚洲麻豆av| 久久青青草原一区二区| 一区二区日韩伦理片| 中文精品视频一区二区在线观看| 一区二区日韩伦理片| 欧美精品一区二区三| 欧美肉体xxxx裸体137大胆| 国产精品久久久久久久久免费桃花| 亚洲精品日本| 亚洲欧美激情四射在线日| 亚洲永久在线观看| 亚洲欧美日韩在线| 亚洲视频一区在线| 久久久精品五月天| 欧美日本高清视频| 亚洲精选一区| 亚洲三级视频在线观看| 国产一区成人| 亚洲国产一区二区三区a毛片| 亚洲免费电影在线观看| 欧美激情影音先锋| 亚洲自啪免费| 欧美激情视频在线播放| 国产模特精品视频久久久久| 黄色成人精品网站| 亚洲乱码国产乱码精品精天堂| 欧美激情一区二区三区 | 欧美天堂亚洲电影院在线播放| 亚洲精品自在在线观看| 日韩一级免费| 久久九九国产精品| 亚洲激情女人| av成人老司机| 久久综合久久综合这里只有精品| 欧美精品18+| 亚洲一区二区少妇| 亚洲高清在线观看| 亚洲一区三区电影在线观看| 美女91精品| 国产有码在线一区二区视频| 一本久道久久综合狠狠爱| 麻豆免费精品视频| 亚洲午夜激情在线| 国内偷自视频区视频综合| 欧美激情一区在线| 国产精品一区二区在线观看| 欧美成人在线影院| 久久久噜噜噜久噜久久| 国产精品久久久久毛片软件| 久久嫩草精品久久久精品| 中文网丁香综合网| 国产日本欧美一区二区三区在线| 性久久久久久久久| 日韩视频欧美视频| 国产日韩一区二区| 久久久.com| 午夜视频在线观看一区二区| 国产精品久久久久av| 欧美黄色成人网| 亚洲欧美国产高清va在线播| 亚洲第一精品夜夜躁人人爽| 老鸭窝91久久精品色噜噜导演| 欧美日韩第一区| 在线视频欧美精品| 久久精品国产亚洲a| 亚洲大片在线观看| 亚洲一区二区三区777| 亚洲激情网站免费观看| 欧美一区二区精品久久911| 国产一区二区精品| 99在线精品视频| 亚洲日本乱码在线观看| 午夜久久一区| 国产精品99久久久久久久vr| 中文亚洲欧美| 亚洲视频综合在线| 欧美精品99| 亚洲电影下载| 1024日韩| 久久久久高清| 开心色5月久久精品| 国产日韩av一区二区| 9人人澡人人爽人人精品| 亚洲老板91色精品久久| 美国三级日本三级久久99| 久久免费视频一区| 国模精品一区二区三区| 久久精品国产77777蜜臀| 久久狠狠亚洲综合| 免费观看在线综合| 亚洲一区二区三区高清| 欧美激情亚洲视频| 亚洲日本成人| 一区二区三区国产在线观看| 欧美日韩dvd在线观看| 亚洲精品在线二区| 国产一区二区三区免费在线观看 | 欧美日韩国产美| 亚洲七七久久综合桃花剧情介绍| 亚洲破处大片| 午夜精品视频网站| 欧美综合国产精品久久丁香| 欧美精品久久99| 亚洲人体偷拍| 亚洲免费中文| 国产亚洲欧美一区二区三区| 久久精品成人一区二区三区| 欧美福利影院| 亚洲午夜国产成人av电影男同| 国产精品你懂得| 久久成人国产精品| 欧美韩日一区二区| 亚洲伊人一本大道中文字幕| 国产视频久久久久久久| 久久欧美中文字幕| 亚洲精选在线观看| 欧美综合国产| 亚洲区中文字幕| 国产精品人人做人人爽| 亚洲国产毛片完整版| 国内精品伊人久久久久av影院| 久久九九久精品国产免费直播| 亚洲国产精品久久人人爱蜜臀| 亚洲午夜久久久久久久久电影院| 国产亚洲a∨片在线观看| 免费欧美视频| 在线观看免费视频综合| 亚洲欧美日韩一区二区三区在线观看 | 国产乱码精品一区二区三区五月婷 | 久久超碰97中文字幕| 亚洲激情第一区| 精品88久久久久88久久久| 亚洲一级在线| 欧美成人亚洲| 欧美一区二区三区在线看 | 99国产一区| 欧美欧美天天天天操| 午夜在线成人av| 亚洲欧洲日产国码二区| 久久久久久久激情视频| 中国女人久久久| 一色屋精品视频免费看| 国产精品黄色在线观看| 欧美jizz19性欧美| 欧美一区视频在线| 午夜久久久久久| 99re视频这里只有精品| 国产日韩精品综合网站| 欧美乱妇高清无乱码| 久久久久久久97| 午夜精品久久久久久久99水蜜桃| 亚洲国产精品成人久久综合一区| 久久精品网址| 香蕉尹人综合在线观看| 亚洲天堂av高清| 夜夜嗨av一区二区三区四区| 亚洲国产一区二区在线| 尤物yw午夜国产精品视频明星| 国产伦精品一区二区三区免费迷| 欧美日韩国产综合视频在线观看中文 | 国产日韩欧美中文| 国产精品免费福利| 国产精品成人免费| 欧美三级日韩三级国产三级| 欧美另类在线观看| 欧美精品系列| 欧美精品v国产精品v日韩精品| 美国十次成人| 欧美电影免费观看网站| 日韩网站在线看片你懂的| 你懂的成人av| 一区二区精品| aa级大片欧美| 在线综合亚洲欧美在线视频| 亚洲伦伦在线| 一区二区三区精品国产| 亚洲视频综合| 亚洲一二区在线| 午夜精品久久久久影视| 欧美一级理论性理论a| 久久国产精品高清| 亚洲免费人成在线视频观看| 亚洲一区二区三区涩| 亚洲午夜免费福利视频| 亚洲综合国产激情另类一区| 香蕉精品999视频一区二区| 欧美一区二区三区在线免费观看 | 国产一区二区精品久久| 精品成人一区| 日韩午夜激情电影| 午夜日韩激情| 欧美wwwwww| 亚洲精品小视频| 亚洲欧美激情视频在线观看一区二区三区 |