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,此内存池里有一个指针指向下一个对象。