所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。
举例来说:class foo{};
foo* pfoo = new foo;
pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。
而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象。
placement new的好处:
1)在已分配好的内存上进行对象的构建,构建速度快。
2)已分配好的内存可以反复利用,有效的避免内存碎片问题。
例子:
#include <iostream>
using namespace std;
class MyClass {
public :
int b;
MyClass()
{
b = 0;
}
};
char *buf=new char[100*sizeof(MyClass)+ sizeof(int) ];
//或者char buf[N*sizeof(MyClass)+ sizeof(int) ];
int main(){
MyClass * pClass=new(buf) MyClass;
cout << sizeof(*pClass)<<endl;
return 0;
}
单步执行:
如果使用MyClass * pClass=new MyClass;
会经历3步:
1:用operator new申请内存
2:调用构造函数创建对象
3:将对象的地址指针指向申请到的内存
而使用MyClass * pClass=new(buf) MyClass;
则将第一步省略,直接将预先申请到的内存空间进行使用,去掉了动态申请内存的时间,看一下:
容易看出,pClass的地址指向了之前已经动态申请到的内存块buf了。
参考: