class Airplane{
private:
struct AirpRef {
unsigned long miles;
char type;
};
private:
union {
AirpRef rep;
Airplane *next;
};
public:
static void *operator new(size_t sizes) {
if(sizes != sizeof(Airplane)) return ::operator new(sizes);
Airplane *p = headOfFreeList;//得到一块内存
if(p) headOfFreeList = p->next;//如果有效
else {
//empty
Airplane* newBlock = static_cast<Airplane*>(::operator new(block_size * sizeof(Airplane)));
for(int i = 1; i < block_size - 1; ++i) {
newBlock[i].next = &newBlock[i + 1];
}
newBlock[block_size - 1].next = 0;
p = newBlock;
headOfFreeList = &newBlock[1];
}
return p;
}
static void operator delete(void *p,size_t sizes) {
if(p == 0) return;
if(sizes != sizeof(Airplane)) {
::operator delete(p);
return;
}
Airplane * carcass = static_cast<Airplane*>(p);
carcass->next = headOfFreeList;
headOfFreeList = carcass;
}
private:
static const int block_size;
static Airplane* headOfFreeList;
};
const int Airplane::block_size = 512;
Airplane* Airplane::headOfFreeList;
const int N = 100;
Airplane *p[N],*p2[N];
for(int i = 0; i < N; i++) {
p[i] = new Airplane;
p2[i] = reinterpret_cast<Airplane*>(malloc(sizeof(Airplane)));
}
for(int i = 0; i < 5; i++) {
cout<<p[i]<<endl;
}
cout<<endl;
for(int i = 0; i < 5; i++) {
cout<<p2[i]<<endl;
}
return 0;
测试结果:
前五个使用的内存池,每个元素之间相隔是8,而用原生的malloc则相隔0x40(64),可见内存池在节省内存方面的优秀。