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

  • 相关阅读:
    BZOJ1029:[JSOI2007]建筑抢修(贪心,堆)
    1054. [HAOI2008]移动玩具【BFS】
    1297. [SCOI2009]迷路【矩阵乘法】
    1192. [HNOI2006]鬼谷子的钱袋【进制】
    2243. [SDOI2011]染色【树链剖分】
    1051. [HAOI2006]受欢迎的牛【强连通分量】
    codevs 2074 营救 WW
    codevs 1191 数轴染色
    codevs 2855 游乐园的迷宫 bfs
    codevs 2806 红与黑
  • 原文地址:https://www.cnblogs.com/hont/p/16143029.html
Copyright © 2020-2023  润新知