Moja aplikacja używa dużej liczby obiektów Panda
. Każdy obiekt Panda
ma listę obiektów Bamboo
. Ta lista nie zmienia się po zainicjowaniu Panda
(nie dodaje się ani nie usuwa obiektów). Obecnie moja klasa jest realizowany w następujący sposób:Obiekty o zmiennej długości: Czy kiedykolwiek był to dobry pomysł?
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 ...
}
}
Aby zmniejszyć obciążenie alokacji tablicę Bamboo
obiektów, mogłaby wdrożyć tę klasę następująco - w zasadzie, zamiast tworzenia obiektów poprzez regularne konstruktora, konstrukcję metoda przydziela jeden blok pamięci do przechowywania zarówno obiekt Panda
i jego Bamboo
tablicy:
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;
}
}
Czy przewiduje żadnych problemów z drugiego projektu, inne niż zwiększonego wysiłku technicznego? Czy jest to akceptowalny wzorzec projektu, czy po prostu przedwczesna optymalizacja, która mogłaby mnie później ugryźć?
Ugryzie. I będzie mocno gryźć. –
Przełamujesz większość semantyki dla typów klas w C++. Obiekty o zmiennej długości nie istnieją w C++. – jalf
Jeśli interesują Cię fascynujące sztuczki tego typu, możesz również zapoznać się z szablonami klas TBuf8 i TBuf16 z Symbian/C++. –