class Foo {
public:
Foo(int x) : id(x) {}
int getId() {return id;}
~Foo() {}
void *operator new(size_t sizes) {
Foo *p;
if(!freeStore) {
//linkList is empty
size_t num = FooNum * sizes;
freeStore = p = reinterpret_cast<Foo*>(new char [num]);
while(p != &freeStore[FooNum - 1]) {
p->next = p + 1;
p++;
}
p->next = 0;
}
p = freeStore;
freeStore = freeStore->next;
return p;
}
void operator delete(void *p,size_t) {
(static_cast<Foo*>(p))->next = freeStore;
freeStore = static_cast<Foo*>(p);
}
private:
Foo *next;
int id;
static int FooNum;
static Foo *freeStore;
};
int Foo::FooNum = 24;
Foo* Foo::freeStore = 0;
内存池的实现节省了空间和时间。
每次new一个对象都会存在一个cookie,如果连续new多个对象会有很多个cookie从而会浪费内存,内存池的实现则使得cookie变为一个,即只new一次。Foo中有一个int和一个指针(分别都是4字节)所以间隔8字节。

省的时间在于new底层会调用malloc,则因此减少了调用malloc的次数。精髓在于重载new和delete,此内存池里有一个指针指向下一个对象。
这篇博客详细介绍了如何通过C++实现内存池,避免频繁的malloc调用,通过复用内存块来减少空间浪费,并优化new和delete操作,提高性能。关键在于使用静态数组和链表管理空闲对象,确保快速分配和释放。

被折叠的 条评论
为什么被折叠?



