В моем приложении используется большое количество Panda
объектов. Каждый Panda
имеет список Bamboo
объектов. Этот список не изменяется после инициализации Panda
(не добавляются или удаляются объекты Bamboo
). В настоящее время мой класс реализуется следующим образом:Объекты с переменной длиной: Всегда хорошая идея?
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 ...
}
}
Чтобы облегчить нагрузку выделения массива Bamboo
объектов, я мог бы реализовать этот класс следующим образом - в основном, вместо того, чтобы создавать объекты с помощью регулярного конструктора, конструкции метод выделяет один блок памяти для хранения как Panda
объекта и его Bamboo
массива:
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;
}
}
Может ли вы предвидеть любые проблемы со второй конструкцией, кроме возросшего усилия по техническому обслуживанию? Является ли это приемлемым шаблоном дизайна или просто преждевременной оптимизацией, которая могла бы снова укусить меня?
Это кусается. И он сильно укусит. –
Вы нарушаете большую часть семантики для типов классов в C++. Объекты переменной длины не существуют в C++. – jalf
Если вы заинтересованы в таких эффектных масках, вы можете также взглянуть на шаблоны классов TBuf8 и TBuf16 с Symbian/C++. –