什么是placement new?
所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可
placement new的好处
- 在已分配好的内存上进行对象的构建,构建速度快
- 已分配好的内存可以反复利用,有效的避免内存碎片问题。
operate new 重载
当我们创建一个类的对象时,调用如下:
class MyClass {…};
MyClass * p=new MyClass;
其实是执行了 new operator. 这个操作符是无法重载的.我们可以重载的是: operator new
所以调用 new
执行了什么:
- 调用
operator new
重载开辟空间 - 调用构造函数生成对象,初始化
- 返回响应的指针
存在的问题
- new操作符分配内存需要在堆中查找足够大的剩余空间,这个操作速度是很慢的,而且有可能出现无法分配内存的异常(空间不够)。
- placement new就可以解决这个问题。我们构造对象都是在一个预先准备好了的内存缓冲区中进行,不需要查找内存,内存分配的时间是常数;而且不会出现在程序运行中途出现内存不足的异常。所以,placement new非常适合那些对时间要求比较高,长时间运行不希望被打断的应用程序
使用方法
- 缓冲区提前分配
- 对象构造与初始化
- 对象销毁
- 内存释放
class A {
public:
A() {
cout << "A()" << endl;
}
A(string s) :str(s) {
cout << "A(string s)" << endl;
}
~A() {
cout << "~A()" << endl;
}
string str;
};
int main() {
void *buffer = operator new(sizeof(A));
A* pa = new(buffer) A("abc");
cout << pa->str << endl;
delete pa;
return 0;
}