首页 > 其他分享 >new、delete重载实现对象池

new、delete重载实现对象池

时间:2024-10-23 23:47:13浏览次数:3  
标签:next Queue QueueItem 重载 new memPool delete

new、delete重载实现对象池

重载new之后,函数执行完成之后会自动调用构造函数;同样的delete是先析构在执行内存释放

对象池

当有大量的开辟空间与释放空间的操作时,会影响程序的执行性能。因此,可以预先开辟出一块内存,需要创建对象的时候去取,需要释放的时候,归还内存。那么程序的性能会有提升。

举例

class Queue

模板类Queue主要实现了一个链式队列

template<typename T>
class Queue
struct QueueItem

链式队列的节点类型

 struct QueueItem{   
     QueueItem(T data = T()) :data_(data), next_(nullptr) {};
     T data_;
     QueueItem* next_;
 };
QueueItem 对象池的实现
  • struct QueueItem内部重载new、delete来控制在创建对象与释放对象的时候的对内存的逻辑管理。其中new与delete伪静态函数因此需要静态指针对其控制
 static QueueItem* memPool_;
 static const int POOLBLOCKSIZE = 100000;

// 重载new、delete 自定义实现QueueItem的内存管理
 void* operator new(size_t size)
 {
     if (memPool_ == nullptr)
     {
         memPool_ = (QueueItem *)new char[sizeof(QueueItem) * POOLBLOCKSIZE];
         QueueItem* q = memPool_;
         for (; q < memPool_ + POOLBLOCKSIZE - 1; q++)
         {
             q->next_ = q + 1;
         }
         q->next_ = nullptr;
     }
     QueueItem* q = memPool_;
     memPool_ = memPool_->next_;
     q->next_= nullptr;
     return q;
 }

 void operator delete(void* p)
 {
     QueueItem* ptr = (QueueItem*)p;
     ptr->next_ = memPool_;
     memPool_ = ptr;
 }

其他

template<typename T>
Queue<T>::QueueItem* Queue<T>::QueueItem::memPool_ = nullptr;   

静态成员变量,在结构体外定义的时候,如果出现以上代码,那么就会出现编译器并不知道Queue::QueueItem是个类型还是变量 不知道*是指针还是乘号的情况,因此需要typename标明它是一个类型

template<typename T>
typename Queue<T>::QueueItem* Queue<T>::QueueItem::memPool_ = nullptr;

标签:next,Queue,QueueItem,重载,new,memPool,delete
From: https://blog.csdn.net/weixin_43459437/article/details/143196747

相关文章

  • NewStar2024-week3-Crypto
    古典密码不想看而且最近很忙,wp就贴exp了Crypto不用谢喵fromCrypto.CipherimportAESfromCrypto.Util.numberimport*importosKEY=b"fake_key_fake_ke"FLAG="flag{fake_flag_fake_flag}"defdecrypt(c):AES_ECB=AES.new(KEY,AES.MODE_ECB)......
  • 生产数据恢复系列之使用闪回查询恢复Oracle delete误删数据
    一、背景在日常运维过程中,如果不小心使用高危命令删除了数据库的数据,如果没有数据备份,记住不要跑路噢,跟着我一起学习如何恢复数据。二、概念普及UNDO表的作用Undo表存储了已提交和未提交事务所产生的旧数据版本,在需要回滚事务或实现并发控制时使用。每当对数据库进行DM......
  • malloc底层实现以及和new的比较
    背景:前几天去面试,被问到了一个问题:“malloc的底层实现是怎样的?怎样防止内存碎片?”当时答的不够好,现在再整理一下。(本文档通过收集整理网上博客而来。先挖个坑,等有时间了去看一下《深入理解操作系统》的第九章虚拟内存,再重新整理一篇)内存布局Linux中每个进程都有自己的虚拟地......
  • 重载运算符、析构函数
    重载运算符、析构函数1.重载运算符2个对象进行==比较,重载==运算符说白了,就是,写一个成员函数,这个成员函数名"operator==",这个成员函数体里边写一些比较逻辑//定义Time&operator=(constTime&tmpobj)//实现Time&Time::operator=(constTime&tmpobj){cout......
  • Ubuntu系统中,使用matplotlib画图调用times new romain字体报错 findfont: Font family
    画图时报错,缺少字体findfont:Fontfamily['TimesNewRoman']notfound.FallingbacktoDejaVuSans.有两种解决方式:方式一:在线安装msttcorefonts包#安装msttcorefonts包这种方式需要ubuntu能连外网,否则因为访问source-forge失败而告终sudoaptupdatesudoapti......
  • 面向对象 加法运算符重载
    ////Createdby徐昌真on2024/10/18.//#include<iostream>usingnamespacestd;//定义一个复数类classComplex{public:Complex():real(0),image(0){}Complex(intreal,intimage){//这是一个传参构造函数用于传入成员变量的值this-......
  • json-server详细模拟GET、POST、DELETE等接口数据教程
    引言在前端开发过程中,我们经常需要在后端API尚未就绪的情况下模拟接口数据。json-server是一个强大而灵活的工具,可以帮助我们快速创建一个模拟的RESTfulAPI。本文将详细介绍如何使用json-server来模拟GET、POST、PUT、PATCH、DELETE等常用的HTTP方法,以及如何处理复杂的数......
  • Java的重载和主要内存区
    JAVA的重载​在Java中,重载(Overloading)是指在同一个类中可以定义多个同名的方法,但它们的参数列表必须不同。重载可以通过改变参数的数量、类型或者顺序来实现。重载提高了代码的可读性和灵活性。JAVA重载要满足的条件:在同一个类下:java的重载必须在同一个类之下方法名相同......
  • 奇怪的错误:关于函数重载,头文件使用和新手避坑的小科普
    奇怪的错误:关于函数重载,头文件使用和新手避坑的小科普题目描述        个小球排成一排,现在有种不同颜色的油漆,给每个小球都涂色。如果相邻两个小球的颜色必须不同,那么共有多少种涂法?输入        一行,两个整数,。输出        一行,一个整数,为满......
  • NewStarCTF-WP合集
    梦开始的地方第一~二周misc-decompress将所有压缩文件放在一个目录,使用Bandizip解压.001,然后使用md5计算器计算内部内容,即可获得flagmisc-用溯流仪见证伏特台首先进入所给链接找到威胁盟报告,发现由于b站原因导致视频不清晰,于是下载央视频后搜索该新闻,再读出信息powerj7km......