何为placement new呢?placement new 是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。

首先我们区分下几个容易混淆的关键词:new operator、operator new、placement new 。

对于new operator,其实它是语言内建的,我们是没有办法改变它的。当我们创建了一个new表达式时,会发生两件事。首先,使用operator new()分配内存,然后调用构造函数。现在明白了吧,new operator会去调用operator new()跟创建对象的构造函数,我们能控制的,只有内存的分配函数operator new()(对于operator delete()也是一样)。所谓控制,其实就是重载这个函数,编译器将用重载的operator new代替默认的版本去分配内存。

接下来就是要说的placement new了。其实它也是operator new重载的一个版本,只是很少人用到它。它有一个特点,就是允许你在已经分配好的内存上创建一个对象,也就是说,可以通过某种手段在指定的内存创建对象。

好了,说到这里,我们就可以利用它来做一些高效率的事情了。

当我们用new分配对象数组空间时,会自动调用对象的默认构造函数。可是如果数组只有一部分元素会被使用,或者元素立即被赋值,那刚刚自动调用对象的默认构造函数不就等于白做了吗?这时候placement new就发挥作用了,因为它可以在分配好的缓冲区上创建对象。采用这种方式,缓冲区占用的存储区的分配,可以避免被默认的构造函数初始化:

const size_t n = sizeof(string) * 30;

string *sbuf = static_cast<string *>(::operator new(n));/*这时候是直接调用operator new函数来分配内存的,也就是说,只会分配空间,类似于malloc。*/

下面是一个在分配好的内存空间上创建对象的函数:

void append(string buf[], int &size, const string &val)

{new (&buf[size++] string(val);}//palcement new

这样的话,我们就可以在需要的情况下使用pacement new通过复制构造函数来初始化数组里的元素,在一些情况下能够提高程序的效率。

但这样的话我们就得自己来负责清理工作了,凡事有利必有弊吧。

这里得通过显式调用string的析构函数,如:

buf[size].~string();

并用operator delete来释放存储区:

::operator delete(buf);

转载于:https://www.cnblogs.com/coolzgx/archive/2009/12/19/1627662.html

关于placement new相关推荐

  1. Complex Instance Placement

    转自: https://specs.openstack.org/openstack/openstack-user-stories/user-stories/proposed/complex-insta ...

  2. Placement new

    new 操作一般可以分为两个过程:1为申请内存空间 2为调用类型的构造函数进行构造 placement new 调用类型的构造函数对已存在的内存进行构造 1 #include<new.h> ...

  3. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  4. OpenStack Placement Project(Rocky to Train)

    目录 文章目录 目录 前言 背景 Placement 基本概念 数据模型 指令行 Placement Web Application 的实现与分析 Placement 在 Nova 中的应用 Get ...

  5. OpenStack Nova Placement API 统一资源管理接口的未来

    目录 目录 Placement API 为何称之为 "未来" 操作对象基本概念 数据库操作样例 Placement API 在创建虚拟机时的调度过程 Placement REST ...

  6. Placement new的用法及用途

    什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...

  7. pymysql安装_openstack stein安装placement

    openstack stein install placement 安装组件: placement 注:安装服务均遵循以下步骤: mariadb创库授权 keystone创建角色并关联 keyston ...

  8. CNCF 沙箱项目 OCM Placement 多集群调度指南

    作者: ​邱见|红帽资深软件工程师,Open Cluster Management (OCM) 社区发起人,负责人​ ​郝青|红帽高级软件工程师,Open Cluster Management (OC ...

  9. placement new(转)

    今天看STL源码遇到一个问题: template <class _T1, class _T2> inline void _Construct(_T1* __p, const _T2& ...

  10. placement new 操作符

    placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...

最新文章

  1. 精读《手写 SQL 编译器 - 错误提示》
  2. LeetCode 17 电话号码的字母组合
  3. android 等待动画 库,android--AnimationDrawable实现等待动画效果
  4. 变量的比较之equals 与 == 的区别
  5. 开机自启动脚本_使用xtu降低笔记本(游戏本)cpu电压及功耗·游戏本延时(以及试着解决开机自启动的问题)...
  6. 输入一个数,判断他是不是质数
  7. 随想录(搭建自己嵌入式项目的编译系统)
  8. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
  9. java linklist6_Java基础知识点总结--从细节再看Java(六)--List及LinkedList
  10. python中string函数的用法_python中string模块各属性以及函数的用法
  11. vpay商城系统开发app
  12. Vampire:吸血鬼
  13. m1芯片Mac如何玩ios手游
  14. FHQ Treap 详解
  15. Message创建方式:new Message和obtainMessage的区别
  16. 企业WiFi管理需求
  17. 直呼OMG!键盘残余热量可能泄露密码
  18. 从零开始nodejs系列文章-nodejs到底能干什么
  19. 基于android地图国内外研究,开题报告-基于Android平台的手机Web地图服务设计.doc...
  20. 使用Excel进行时间转换(附时间小知识)

热门文章

  1. 关系图︱python 关系网络的可视化NetworkX(与Apple.Turicreate深度契合)
  2. 笔记︱多种常见聚类模型以及分群质量评估(聚类注意事项、使用技巧)
  3. python中函数 reshape(-1,1)
  4. centos7-防火墙
  5. React Native在Android当中实践(一)——背景介绍
  6. iOS 用自签名证书实现 HTTPS 请求的原理
  7. AndroidStudio实用快捷键组合
  8. Lucene中的一些基本概念
  9. Linux下运行java DES AES加解密
  10. nginx服务器能ping通,访问不了的解决办法