Как сказал Адриан в своем ответе , то, что вы делаете в памяти, не должно совпадать с тем, что вы делаете по сети. На самом деле, было бы даже неплохо четко разделить это, потому что наличие протокола связи, основанного на том, что ваши данные разрабатываются особым образом, создает огромную проблему, если впоследствии вам потребуется рефакторинг данных.
C ++ способ хранить произвольное количество элементов непрерывно, конечно, std::vector
. Поскольку вы даже не рассматривали это, я предполагаю, что есть что-то, что делает это нежелательным. (У вас есть только небольшое количество ArrayOfThese
и вы боитесь пространства, связанного с std::vector
?)
Хотя хитрость с перераспределением массива нулевой длины, вероятно, не гарантированно работает и может технически вызвать ужасное неопределенное поведение, оно широко распространено. На какой ты платформе? В Windows это делается в Windows API, поэтому сложно представить поставщика, поставляющего компилятор C ++, который бы не поддерживал это.
Если число элементов ArrayOfThese
ограничено, вы также можете использовать трюк fnieto , чтобы указать эти несколько чисел, а затем new
один из результирующих экземпляров шаблона, в зависимости от выполнения. номер времени:
struct DataPoint {
int a;
int b;
int c;
};
template <std::size_t sz>
struct DataPointWithArray : DataPoint {
ArrayOfThese array[sz];
};
DataPoint* create(std::size_t n)
{
switch(n) {
case 1: return new DataPointWithArray[1];
case 2: return new DataPointWithArray[2];
case 5: return new DataPointWithArray[5];
case 7: return new DataPointWithArray[7];
case 27: return new DataPointWithArray[27];
default: assert(false);
}
return NULL;
}