<八>通过new和delete重载实现对象池的应用

MyQueue版本1

#include <iostream>
using namespace std;
template<typename T>
class MyQueue {
private:
	struct QueueItem {
	QueueItem(T _data = T(), QueueItem * _next = nullptr)
	:data(_data),
	next(_next) {
	next = nullptr;
	}
	T data;
	QueueItem * next;
	};
	QueueItem * _front;//指向队头
	QueueItem * _rear; //指向队尾
public:
	//队尾入队操作
	void push(T & _value) {
	QueueItem *tep = new QueueItem(_value, nullptr);
	_rear->next = tep;
	_rear = tep;
	}
	//队头出队操作
	void pop() {
	if (empty()) { return; }
	QueueItem *tep = _front->next;
	_front->next = tep->next;
	//如果队中只有一个元素,被删除了,由于这个出队的元素要delete,所以,_rear 就丢失信息了,这个时候要记得把_rear=nullprt
	if (_front->next == nullptr) { _rear = nullptr; }
	delete tep;
	}
	//队是否为空
	bool empty() {
	return _front = _rear;
	}
	~MyQueue() {
	QueueItem *current = _front;
	while (current != nullptr) {
	_front = _front->next;
	delete current;
	current = _front;
	}
	}
	MyQueue<T>() {
	QueueItem *tep = new QueueItem;
	_front = tep;
	_rear = tep;
	}
	T front() {
	 return _front->next; ->data;
	}
};
int main() {
	MyQueue<int> mq;
	for (int i = 0; i < 10000000; i++) {
	mq.push(i);
	mq.pop();
	}
	bool isEmpty = mq.empty();
	cout << isEmpty << endl;
	system("pause");
	return 0;
}

上面代码有个效率问题,循环 10000000 次,一直在创建 对象,和销毁对象. 如何优化?

MyQueue版本2

#include <iostream>
using namespace std;
template<typename T>
class MyQueue {
private:
	struct QueueItem {
	
	QueueItem(T _data = T(), QueueItem * _next = nullptr)
	:data(_data),
	next(_next) {
	next = nullptr;
	}
	//分配内存
	void * operator new(size_t size) {
	
	if (poolItemList == nullptr) {
	
	//预先申请内存空间	
	poolItemList = (QueueItem *) new char[sizeof(QueueItem) * POOL_ITEM_SIZE];
	QueueItem * tp = poolItemList;
	//把上面申请的内存空间 按照 一个 一个 QueueItem 串到队列中
	while (tp < poolItemList + POOL_ITEM_SIZE -1) {
	tp->next = tp + 1;
	++tp;
	}
	tp->next = nullptr;
	cout << "1:申请缓存池空间" << poolItemList << endl;
	
	}
	
	QueueItem * returnPoint = poolItemList;
	poolItemList = poolItemList->next;	
	//	cout << "申请QueueItem节点空间" << returnPoint << endl;
	return returnPoint;
	
	}
	//将使用过的内存还会去
	void operator delete(void * ptr) {
	
	//归还的内存放回到链表头部
	if (ptr != nullptr) {
	QueueItem * qptr = (QueueItem *)ptr;	
	QueueItem *	tp_poolItemList = poolItemList;
	qptr->next = poolItemList;
	poolItemList = qptr;
	//	cout << "归还空间" << ptr << endl;
	}
	}
	T data;
	QueueItem * next;
	static const int POOL_ITEM_SIZE = 10000;
	static QueueItem * poolItemList ;
	};
	
	
	QueueItem * _front;//指向队头
	QueueItem * _rear; //指向队尾
	
	
public:
	//构造函数
	MyQueue<T>() {
	QueueItem *tep = new QueueItem();
	_front = tep;
	_rear = tep;
	}
	~MyQueue() {
	QueueItem *current = _front;
	while (current != nullptr) {
	_front = _front->next;
	delete current;
	current = _front;
	}
	}
	//队尾入队操作
	void push(T & _value) {
	QueueItem *tep = new QueueItem(_value, nullptr);
	_rear->next = tep;//原来队尾元素的下一节点设置为当前申请节点
	_rear = tep;
	}
	//队头出队操作
	void pop() {
	if (empty()) { return; }
	QueueItem *first = _front->next;
	_front->next = first->next;
	//如果队中只有一个元素,被删除了,由于这个出队的元素要delete,所以,_rear 就丢失信息了,这个时候要记得把_rear=nullprt
	if (_front->next == nullptr) { _rear = _front; }
	delete first;
	}
	//队是否为空
	bool empty() {
	return _front == _rear;
	}
	T front() {
	 return _front->next->data;
	}
};
template<typename T>
typename MyQueue<T>::QueueItem * MyQueue<T>::QueueItem::poolItemList =nullptr;
int main() {
	MyQueue<int> mq;
	for (int i = 0; i < 100000; i++) {
	mq.push(i);
	mq.pop();
	}
	bool isEmpty = mq.empty();
	cout << isEmpty << endl;
	system("pause");
	return 0;
}
作者:Hello_Bugs原文地址:https://www.cnblogs.com/erichome/p/16919768.html

%s 个评论

要回复文章请先登录注册