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特性进行操作的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!