C++关键字:Placement new

来源:互联网 发布:php自动补全函数 编辑:程序博客网 时间:2024/06/05 03:44

 

 

Placement newC++提供的一个很有意思的特性new或者mallo函数会在堆里面分配空间,这个分配可能是非常耗时的Placement new可以为对象提前分配好内存,当应用要使用的对象很多的时候,由于Placement new申请内存使用的时间是常数,这个方法可以节省很多时间。

 

Placement new的使用语法:

1)提前申请一块buf:

char *buf=newchar[N*sizeof(PlacementNew)+sizeof(int)];

2) 创建PlacementNew对象

PlacementNew *placementnew= new (buf) PlacementNew;

3 释放Placement对象

placementnew->~PlacementNew();

4)程序结束时释放buf指向的空间:

delete buf;

 

下面是示例:

/*

Placement.cpp

OperatorNew,后PlacementNew

编译:g++ PlacementNew.cpp  -o placementnew

*/

 

#include <iostream>

#include <sys/time.h>

#include <unistd.h>

#include <stdio.h>

 

#define  N10

class PlacementNew {

       public:

       int mArray[10000][1000];

};

 

int getCurrentMillis()

{

       struct timevaltv;

       struct timezonetz;

       gettimeofday (&tv , &tz);

       printf("%ds ", tv.tv_sec);

       printf("%dus/n",tv.tv_usec);

       return 1;

}

 

int main(int argc, char* argv[])

{

       char *buf=new char[N*sizeof(PlacementNew)+sizeof(int)];

      

       PlacementNew *placementnew =NULL;

       PlacementNew *operatornew = NULL;

       printf("OperatorNew /n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

      

       printf("PlacementNew /n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

      

       printf("OperatorNew 2/n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

 

       printf("PlacementNew 2/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

       return 1;

}

 

 

Placement.cpp运行结果:

 

Operator New

1308728379 s 872584 us

1308728379 s 872717 us

Placement New

1308728379 s 872722 us

1308728379 s 872724 us

Operator New 2

1308728379 s 872728 us

1308728379 s 872758 us

Placement New 2

1308728379 s 872763 us

1308728379 s 872765 us

 

 

 

/*

Placement2.cpp

PlacementNew,后OperatorNew

*/

 

#include <iostream>

#include <sys/time.h>

#include <unistd.h>

#include <stdio.h>

#define  N10

class PlacementNew {

       public:

       int mArray[10000][1000];

};

 

int getCurrentMillis()

{

       struct timevaltv;

       struct timezonetz;

       gettimeofday (&tv , &tz);

       printf("%ds ", tv.tv_sec);

       printf("%dus/n",tv.tv_usec);

       return 1;

}

 

int main(int argc, char* argv[])

{

       char *buf=new char[N*sizeof(PlacementNew)+sizeof(int)];

      

       PlacementNew *placementnew =NULL;

       PlacementNew *operatornew = NULL;

 

       printf("PlacementNew 0/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

 

       printf("OperatorNew 1/n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

      

       printf("PlacementNew 1/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

      

       printf("OperatorNew 2/n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

 

       printf("PlacementNew 2/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

       return 1;

}

 

Placement2.cpp运行结果:

Placement New 0

1308728898 s 256533 us

1308728898 s 256636 us

Operator New 1

1308728898 s 256640 us

1308728898 s 256670 us

Placement New 1

1308728898 s 256675 us

1308728898 s 256677 us

Operator New 2

1308728898 s 256680 us

1308728898 s 256710 us

Placement New 2

1308728898 s 256714 us

1308728898 s 256716 us

 

 

 

 

/*

增加内存清除

Placement3.cpp

*/

 

#include <iostream>

#include <sys/time.h>

#include <unistd.h>

#include <stdio.h>

 

#define  N10

class PlacementNew {

       public:

       int mArray[10000][1000];

 

       PlacementNew(){

              printf("PlacementNew constractor/n");

       }

       ~PlacementNew(){

              printf("PlacementNew deconstractor/n");

       }

};

 

int getCurrentMillis()

{

       struct timevaltv;

       struct timezonetz;

       gettimeofday (&tv , &tz);

       printf("%ds ", (int)tv.tv_sec);

       printf("%dus/n",(int)tv.tv_usec);

       return 1;

}

 

int main(int argc, char* argv[])

{

       char *buf=new char[N*sizeof(PlacementNew)+sizeof(int)];

       int  *intp =new int[10];

       intp[0] =1;

 

       sleep(1);

 

      

       PlacementNew *placementnew =NULL;

       PlacementNew *operatornew = NULL;

 

       printf("PlacementNew 0/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

       //Can not delete it with delete

       //deleteplacementnew;

       //placementnew = NULL;

       //Deleteit with deconstractor

       placementnew->~PlacementNew();

 

       printf("OperatorNew 1/n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

       delete operatornew;

       operatornew = NULL;

      

       printf("PlacementNew 1/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

       //deleteplacementnew;

       //placementnew = NULL;

       //Deleteit with deconstractor

       placementnew->~PlacementNew();

      

       printf("OperatorNew 2/n");

       getCurrentMillis();

       operatornew = new  PlacementNew;

       getCurrentMillis();

       delete operatornew;

       operatornew = NULL;

 

       printf("PlacementNew 2/n");

       getCurrentMillis();

       placementnew = new (buf) PlacementNew;

       getCurrentMillis();

       //deleteplacementnew;

       //placementnew = NULL;

       //Deleteit with deconstractor

       placementnew->~PlacementNew();

       delete[]buf;

       return 1;

}

 

参考文献: http://www.ksarea.com/articles/20080124_cc.html

原创粉丝点击