C++ placement new

什么是placement new?

所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可

placement new的好处

  1. 在已分配好的内存上进行对象的构建,构建速度快
  2. 已分配好的内存可以反复利用,有效的避免内存碎片问题。

operate new 重载

当我们创建一个类的对象时,调用如下:

class MyClass {…};
MyClass * p=new MyClass;

其实是执行了 new operator. 这个操作符是无法重载的.我们可以重载的是: operator new
所以调用 new 执行了什么:

  1. 调用 operator new 重载开辟空间
  2. 调用构造函数生成对象,初始化
  3. 返回响应的指针

存在的问题

  • 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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值