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  阅读(355)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
回到顶部