Für kleine, häufig allokierte Objekte kann new zu teuer sein:
class ding
{ beschr *bs;
public:
...
};
ding *d = new ding;
liefert:
Idee: Speicherverwaltung selbst schreiben:
class ding
{ beschr *bs;
static ding* freiliste;
public:
void* operator new(size_t size);
void operator delete(void * weg, size_t size);
}
ding* ding::freiliste = 0;
Dieses new allokiert Speicherplatz fuer mehrere Objekte des Typs ding und benutzt den Zeiger bs, um diese zu verketten:
void* ding::operator new(size_t size)
{ if (size != sizeof(ding))
return ::new char[size];
ding *p = freiliste;
if (p)
{ freiliste = (ding*) p->bs;
return p;
}
// neuer "roher" Speicher:
ding *neu = (ding*)
new char[256*sizeof(ding)];
for (int i = 0 ; i < 255; i++)
neu[i].bs = (beschr*)&neu[i+1];
// Ende der Freiliste:
neu[255].bs = 0;
freiliste = &neu[1];
return neu;
}
Natürlich braucht dieses new ein eigenes delete!
void ding::operator delete(void *weg,
size_t size)
{ // sende falsche Objekte
// zum globalen delete:
if (size != sizeof(ding))
{ ::delete[]((char*)weg);
return;
}
ding *frei = (ding*) weg;
frei->bs = (beschr*) freiliste;
freiliste = frei;
}