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

posted @ 2022-04-14 09:04  HONT  阅读(326)  评论(0编辑  收藏  举报