Meine Anwendung verwendet eine große Menge von Panda
Objekte. Jede Panda
hat eine Liste von Bamboo
Objekten. Diese Liste ändert sich nicht, wenn die Panda
initialisiert ist (keine Bamboo
Objekte hinzugefügt oder entfernt). Derzeit ist meine Klasse wie folgt umgesetzt:Objekte mit variabler Länge: Immer eine gute Idee?
class Panda
{
int a;
int b;
int _bambooCount;
Bamboo* _bamboo;
Panda (int count, Bamboo* bamboo)
{
_bambooCount = count;
_bamboo = new Bamboo[count];
// ... copy bamboo into the array ...
}
}
Um den Aufwand für die Zuteilung einer Reihe von Bamboo
Objekte zu lindern, konnte ich diese Klasse wie folgt implementieren - grundsätzlich anstelle von Objekten über den regulären Konstruktor erstellen, eine Konstruktion Verfahren ordnet ein einziger Speicherblock sowohl das Panda
Objekt und seine Bamboo
Array zu halten:
class Panda
{
int a;
int b;
Panda()
{
// ... other initializations here ...
}
static Panda *createPanda (int count, Bamboo* bamboo)
{
byte* p = new byte[sizeof(Panda) +
sizeof(Bamboo) * count];
new (p) Panda();
Bamboo* bamboo = (Bamboo*)
p + sizeof(Panda);
// ... copy bamboo objects into the memory
// behind the object...
return (Panda*)p;
}
}
Sie Probleme mit dem zweiten Entwurf, außer dem erhöhten Wartungsaufwand voraussehen können? Ist das ein akzeptables Designmuster oder einfach eine vorzeitige Optimierung, die mich später wieder beißen könnte?
Es wird beißen. Und es wird hart beißen. –
Sie brechen die meisten Semantiken für Klassen in C++. Objekte mit variabler Länge sind in C++ nicht vorhanden. – jalf
Wenn Sie an solchen Hacks interessiert sind, können Sie sich auch die Klassenvorlagen TBuf8 und TBuf16 von Symbian/C++ anschauen. –