new一个对象的语法(通过new和delete重载实现对象池的应用)
导读:MyQueue版本1 #include...
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; }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!