C++中placement new的使用方法有哪些?
摘要:通常创建对象使用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特性进行操作的。
