关于placement new
何为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相关推荐
- Complex Instance Placement
转自: https://specs.openstack.org/openstack/openstack-user-stories/user-stories/proposed/complex-insta ...
- Placement new
new 操作一般可以分为两个过程:1为申请内存空间 2为调用类型的构造函数进行构造 placement new 调用类型的构造函数对已存在的内存进行构造 1 #include<new.h> ...
- 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...
- OpenStack Placement Project(Rocky to Train)
目录 文章目录 目录 前言 背景 Placement 基本概念 数据模型 指令行 Placement Web Application 的实现与分析 Placement 在 Nova 中的应用 Get ...
- OpenStack Nova Placement API 统一资源管理接口的未来
目录 目录 Placement API 为何称之为 "未来" 操作对象基本概念 数据库操作样例 Placement API 在创建虚拟机时的调度过程 Placement REST ...
- Placement new的用法及用途
什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...
- pymysql安装_openstack stein安装placement
openstack stein install placement 安装组件: placement 注:安装服务均遵循以下步骤: mariadb创库授权 keystone创建角色并关联 keyston ...
- CNCF 沙箱项目 OCM Placement 多集群调度指南
作者: 邱见|红帽资深软件工程师,Open Cluster Management (OCM) 社区发起人,负责人 郝青|红帽高级软件工程师,Open Cluster Management (OC ...
- placement new(转)
今天看STL源码遇到一个问题: template <class _T1, class _T2> inline void _Construct(_T1* __p, const _T2& ...
- placement new 操作符
placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...
最新文章
- 精读《手写 SQL 编译器 - 错误提示》
- LeetCode 17 电话号码的字母组合
- android 等待动画 库,android--AnimationDrawable实现等待动画效果
- 变量的比较之equals 与 == 的区别
- 开机自启动脚本_使用xtu降低笔记本(游戏本)cpu电压及功耗·游戏本延时(以及试着解决开机自启动的问题)...
- 输入一个数,判断他是不是质数
- 随想录(搭建自己嵌入式项目的编译系统)
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
- java linklist6_Java基础知识点总结--从细节再看Java(六)--List及LinkedList
- python中string函数的用法_python中string模块各属性以及函数的用法
- vpay商城系统开发app
- Vampire:吸血鬼
- m1芯片Mac如何玩ios手游
- FHQ Treap 详解
- Message创建方式:new Message和obtainMessage的区别
- 企业WiFi管理需求
- 直呼OMG!键盘残余热量可能泄露密码
- 从零开始nodejs系列文章-nodejs到底能干什么
- 基于android地图国内外研究,开题报告-基于Android平台的手机Web地图服务设计.doc...
- 使用Excel进行时间转换(附时间小知识)