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