首页 > 其他分享 >25new和delete重载实现的对象池应用

25new和delete重载实现的对象池应用

时间:2024-01-21 11:33:25浏览次数:26  
标签:25new front next QueueItem 重载 itemPool rear delete

new和delete重载实现的对象池应用

在类底层维护一个结构体链表,new和delete重载以避免大量重复的new和delete操作。

using namespace std;
#include <iostream>
static const int POOL_ITEM_SIZE = 1000000;
template<typename T>
class Queue
{
public:
	Queue()
	{
		_front = _rear = new QueueItem();
	}
	~Queue()
	{
		QueueItem* cur = _front;
		while (cur != nullptr)
		{
			QueueItem* next = cur->_next;
			delete cur;
			cur = next;
		}
		_front = _rear = nullptr;
	}
	void push(const T& val)
	{
		QueueItem* item = new QueueItem(val);
		_rear->_next = item;
		_rear = item;
	}
	void pop()
	{
		if (empty())
		{
			return;
		}
		QueueItem *first = _front->_next;
		_front->_next = first->_next;
		if (_front->_next == nullptr)
		{
			_rear = _front;
		}
		delete first;
	}
	T front() const
	{
		return _front->_next->_data;
	}
	bool empty() const { return _front == _rear; }
private:
	struct QueueItem
	{
		QueueItem(T data = T()) :_data(data), _next(nullptr) {}
		void* operator new(size_t size)
		{
			if (_itemPool == nullptr)
			{
				_itemPool = (QueueItem*)new char[POOL_ITEM_SIZE * sizeof(QueueItem)];
				QueueItem* p = _itemPool;
				for (; p < _itemPool + POOL_ITEM_SIZE - 1; ++p)
				{
					p->_next = p + 1;
				}
				p->_next = nullptr;
			}
			QueueItem* p = _itemPool;
			_itemPool = _itemPool->_next;
			return p;
		}
		void operator delete(void* ptr)
		{
			QueueItem* p = (QueueItem*)ptr;
			p->_next = _itemPool;
			_itemPool = p;
		}
		T _data;
		QueueItem* _next;
		static QueueItem* _itemPool;

	};
	QueueItem* _front;
	QueueItem* _rear;
};

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

int main()
{
	Queue<int> que;
	for (int i = 0; i < 1000000; ++i)
	{
		que.push(i);
		que.pop();
	}
	cout << que.empty() << endl;
	return 0;
}

标签:25new,front,next,QueueItem,重载,itemPool,rear,delete
From: https://www.cnblogs.com/sio2zyh/p/17977660

相关文章

  • 20C++的运算符重载
    C++的运算符重载编译器在做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法)。如果找不到合适的成员方法,则在全局作用域寻找合适的运算符重载函数.#include<iostream>usingnamespacestd;//复数类classCComplex{private: intmreal; intmimage; //友元函......
  • Delete d node at nth position【1月17日学习笔记】
    点击查看代码//Deletednodeatnthposition#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*A;voidinsert(intx){ node*temp=newnode; temp->data=x; temp->next=NULL; if(A==NULL){ A=temp;......
  • 方法重写和方法重载
    原文链接:https://blog.csdn.net/qq_43500067/article/details/89598945方法重写:1、重写方法的方法名,参数列表必须相同,返回类型可以相同也可以是原类型的子类型。2、重写方法不能比原方法抛出更多的异常。3、重写方法的访问权限不能缩小4、方法重写只能用于子类重写父类的方法,父类......
  • C++ 重载bool类型
    在C++中,可以通过重载operatorbool()来实现对自定义类型的bool类型重载。这样,您可以定义自定义类型的对象在条件语句中的行为,使其能够像内置类型一样进行条件判断。下面是一个示例,演示了如何在C++中重载bool类型:#include<iostream>#include<string>usingnamespacestd;cl......
  • c++重载
    注意:函数的返回值不可以作为函数重载的条件函数重载的注意事项1.引用作为重载的条件2.函数重载遇到函数默认参数......
  • csharp c# http request get post put delete header respons json 网络请求
    C#中如何模拟一个post请求使用HttpClient代替。以下是修改后的代码示例:usingSystem;usingSystem.Net.Http;usingSystem.Text.Json;classHttpPostExample{privateasyncTask<string>HttpPost(stringUrl,objectpostData){stringpostDataStr=J......
  • 无涯教程-SQL - 删除操作(Delete)
    SQLDELETE查询用于从表中删除现有记录,您可以将WHERE子句与DELETE查询一起使用,以删除所选的行,否则将删除所有记录。DeleteQuery-语法带WHERE子句的DELETE查询的基本语法如下-DELETEFROMtable_nameWHERE[condition];您可以使用AND或OR运算符组合N个条件。DeleteQuery......
  • 运算符重载及与友元
    友元基本概念:friend关键字只出现在声明处,一个函数或者类作为了另一个类的友元那么这个函数或类就可以直接访问另一个类的私有数据。运算符重载:语法:定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符(例:operator<<)思路:1、识别运算符左......
  • js delete()和 clear()函数
    constm=newMap();constfunctionKey=function(){};constsymbolKey=Symbol();constobjectKey=newObject();m.set(functionKey,"functionValue");m.set(symbolKey,"symbolValue");m.set(objectKey,"ob......
  • 友元函数与运算符重载
    友元函数友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。友元函数是一个不属于类成员的函数,但它可以访问该......