C++ placement new学习
通常创建对象使用new操作,但这样无法指定在具体某一块内存开辟空间创建对象。而如果
可以指定开辟空间的内存位置,我们可以编写内存池高效的复用同一个内存位置,这样可以避免系统频繁申请可用内存
所占用的时间以及内存碎片问题。
指定具体分配内存的具体位置,可以重写new操作符实现:
h:
//Class1.h
#pragma once
class Class1
{
public:
void* operator new(size_t size);
};
cpp:
//Class1.cpp
#include "Class1.h"
#include "stdio.h" void* Class1::operator new(size_t size)
{
printf("operator new!\n");
return ::operator new(size);//这里可以自定义
}
使用:
int main()
{
Class1* c = new Class1();//触发new重写
}
此时可以在类的内部指定new操作行为,以及如何分配内存。
而通过placement new则可以在外部指定分配内存的具体位置(注意,使用了placement new就不能调用delete):
.h:
//Class1.h
#pragma once
class Class1
{
private:
int x;
int y;
int z[4];
public:
void Init();
};
.cpp:
//Class1.cpp
#include "Class1.h"
#include "stdio.h" void Class1::Init()
{
x = 1;
y = 2;
z[0] = 10;
z[1] = 11;
z[2] = 12;
z[3] = 13;
}
使用:
int main()
{
int mem[sizeof(Class1)];
Class1* c = new (mem)Class1;
c->Init(); for (int item : mem)//调试
{
printf("%d\n", item);
};
//1
//2
//10
//11
//12
//13
//-858993460
//...
}
可以看见,指定了分配区域后,除了实现内存池,还可以方便的对分配好的内存进行调试。在UE4中,部分对象的创建就是使用placement new特性进行操作的。
C++ placement new学习的更多相关文章
- 前端框架——BootStrap学习
BootStrap简单总结下:1.栅格系统,能够很好的同时适应手机端和PC端(及传说中的响应式布局) 2.兼容性好 接下来是对BootStrap学习的一些基础案例总结和回顾: 首先引入:bootstr ...
- 《Diagnostic use of facial image analysis software in endocrine and genetic disorders: review, current results and future perspectives》学习笔记
<使用面部图像分析软件诊断内分泌和遗传疾病:回顾,当前研究结果以及未来展望> Abstract 库欣综合征(CS)和肢端肥大症普遍是在发病后几年才能被诊断出的内分泌疾病.现在需要新的诊断方 ...
- bootstrap插件学习-bootstrap.popover.js
先看bootstrap.popover.js的结构 var Popover = function ( element, options ){} //构造器 Popover.prototype = {} ...
- bootstrap插件学习-bootstrap.tooltip.js
先看bootstrap-tooltip.js的结构 var Tooltip = function ( element, options ){} // 构造器 Tooltip.prototype ={} ...
- KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)
继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进 ...
- 绘图工具graphviz学习使用
画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...
- 2017年学习的三个CSS新特性
这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...
- ArcGIS API for JavaScript 4.2学习笔记[10] 2D添加指北针widget、视图保存、视图padding(第二章完结)
这几个例子是第二章除了入门之外比较简单的几个,就做个合集,把最核心的代码(第二参数)和 引用放上来即可,不作多解释. 2D地图添加指北针widget 2D地图一般修正方向为正北方就需要这个widget ...
- 小结:c++中的new、operator new和placement new
小结:c++中的new.operator new和placement new new(也称作new operator),是new 操作符,不可重载 class T{...}; T *t = new T ...
- 学习笔记TF058:人脸识别
人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...
随机推荐
- CF-937(D,E)
CF-937 在补题-- D 分析 我们发现这些因子都是二进制形式的十进制数,n的范围是$1e5$,16的二进制是$10000$,于是可以枚举1~16,把这些因子预处理出来,对于每个n就枚举因子再作除 ...
- #分治NTT,容斥定理,排列组合#LOJ 6503 「雅礼集训 2018 Day4」Magic
题目 桌面上摆放着 \(m\) 种魔术卡,共 \(n\) 张,第 \(i\) 种魔术卡数量为 \(a_i\),魔术卡顺次摆放,形成一个长度为 \(n\) 的魔术序列, 在魔术序列中,若两张相邻魔术卡的 ...
- #Splay#洛谷 1486 [NOI2004]郁闷的出纳员
题目 分析 考虑加减工资直接打标记,查询第\(k\)多可以用平衡树, 删除有点恶心,这里考虑Splay,将需要删除的部分的后继splay到根节点并将左子树断边 代码 #include <cstd ...
- Windows Terminal的资料
Windows Terminal是微软Windows平台难得好用的工具. 由于工作内容的原因,需要打开多个CMD窗口.多个git bash窗口,并且在多个窗口间切换,因此命令行窗口支持多TAB的特性, ...
- 直播预告丨OpenHarmony标准系统多媒体子系统之视频解读
5月19日(周四)晚上19点,OpenHarmony开源开发者成长计划知识赋能第五期"掌握OpenHarmony多媒体的框架原理"的第五节直播课,即将开播! 深开鸿资深技术专家胡浩 ...
- 响应式系统与 React
0x1 React 的历史与应用 应用场景 前端应用开发,如 Meta.Ins.Netflix 的网页版 移动原生应用开发,如 Ins.Discord 结合 Electron 进行桌面应用开发 发展历 ...
- P7177 [COCI2014-2015#4] MRAVI 题解
思路. 我们知道最初添加的液体越多,那么每个蚂蚁得到的液体也就越多,又因为标签里有深搜,所以可以用 DFS+二分解决(感觉说了一通废话),算是比较常规的一种解法了. 在此题中我们需要魔改一下建树,需在 ...
- ElasticSearch 7.7 + Kibana的部署
ElasticSearch目前最新版是7.7.0,其中部署的细节和之前的6.x有很多的不同,所以这里单独拉出来写一下,希望对用7.x的童鞋有一些帮助,然后部署完ES后配套的kibana也是7.7.0, ...
- AGC066 题解
题解:AT_agc066_a [AGC066A] Adjacent Difference 笑点解析:没有必要将总成本最小化. 我们将格子间隔的黑白染色(显然有两种染色方法),对于黑点我们要求它是奇数倍 ...
- 一款跑在云上的定制容器专属 OS 来了——LifseaOS | 龙蜥技术
简介:如果可以把运维 API 化,那我们是不是可以把 OS 也作为一个 K8S 可以管理的资源,让 K8S 像管理容器一样管理OS? 引言 在 2021 年 10 月的云栖大会上,为云原生而生的 ...