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 @   HONT  阅读(352)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示