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特性进行操作的。