C++关键字:Placement new
来源:互联网 发布:php自动补全函数 编辑:程序博客网 时间:2024/06/05 03:44
Placement new是C++提供的一个很有意思的特性。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
- C++关键字:Placement new
- operator new()、placement new()与new关键字
- c++placement new
- 浅谈c++placement new
- more effect c++---placement new
- 【C++】placement new的简单介绍
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- placement new
- Extensions to DML and DDL Statements(pivoting insert)
- OOA&D实践之路——真实案例解析OO理论与实践(一、导言)
- adfa
- Android功能总结:仿照Launcher的Workspace实现左右滑动切换
- 将字符内容拷贝到一个新的excel中CopyDataToExcelFile
- C++关键字:Placement new
- 数据复制的并发控制
- 面试问题
- python re sub
- ControlTemplate和DataTemplate的区别
- OpenGL设置窗口居中显示方法
- 阅读 《大规模并行处理器程序设计》影印版心得 第五章 CUDA Memories
- 杂谈现代高级编程语言
- C#实现数据批量插入