通过重载new与delete运算符避免向系统重复申请内存从而提高程序运行效率的办法

最近在看老师给的数据结构的代码,有对new与delete的重载,之前c++课没有讲过,所以详细看了一下,谁知竟然打开了新世界的大门QwQ。代码如下

 void* operator new(size_t) {  // Overloaded new operator
    if (freelist == NULL) return ::new Link; // Create space//如果freelist为空,用标准new,创建一个空间
    // Can take from freelist//在delete的时候不调用全局的delete,而是将要delete的地址给freelist,下次调用new的时候可以避免向内存申请空间。
    //而是直接将freelist的地址给出来。//同时将这些地址传成一个链表构成内存池方便以后取用
    Link<E>* temp = freelist; 
    freelist = freelist->next;
    return temp;                 // Return the link
  }

  // Overloaded delete operator
  void operator delete(void* ptr) {
     //将原来的地址放在现在地址的下一个
      //将现在的地址归到内存池的头部
    ((Link<E>*)ptr)->next = freelist; // Put on freelist
    freelist = (Link<E>*)ptr;
  }
};

其中freelist是该类中的一个静态成员,声明如下

static Link<E>* freelist; // Reference to freelist head//内存池的头

一开始我是这行代码看不懂

 if (freelist == NULL) return ::new Link; // Create space//如果freelist为空,用标准new,创建一个空间

百度一下,::new表示调用全局new操作符,说人话的意思就是调用C++给你定义好的标准new运算符。这里的freelist其实是一个我们定义的内存池的第一个内存的地址。如果内存池为空,那么就让向系统要个内存返回地址。

  void operator delete(void* ptr) {
     //将原来的地址放在现在地址的下一个
      //将现在的地址归到内存池的头部
    ((Link<E>*)ptr)->next = freelist; // Put on freelist
    freelist = (Link<E>*)ptr;
  }
};

下面就是delete了,我们重载的delete运算符其实并没有释放内存,
而是将内存放入freelist为头的一个链表中,这个链表给出了所以没有本来应该被释放却没有释放的内存的地址。

    Link<E>* temp = freelist; 
    freelist = freelist->next;
    return temp;         

在下次调用new时,返回其中一个在freelist链表中的内存地址,避免了内存的重复申请释放

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值