У меня есть следующая структура
struct Foo {
uint32_t magic;
uint32_t length;
uint8_t data[];
}
Длина дает число байтов в данных.
Как мне выделить это, используя new, чтобы гарантировать ограничения выравнивания?Боюсь, что new uint8_t[length+8]
может выравниваться только для uint8_t.
Еще одна проблема: указатель может содержать Foo *, Bar *, Bla *, Blub *, ... все с магией в качестве первого члена,Большинство из них имеют статический размер и будут выделены с new Bla()
.И я хочу избежать необходимости
switch(p->magic) {
case MAGIC_FOO: delete[](p); break;
case MAGIC_BAR: delete(p); break;
case MAGIC_BLA: delete(p); break;
case MAGIC_BLUB: delete[](p); break;
...
default:
std::cerr << "Don't know how to free a " << p->magic << std:endl;
assert(false);
}
Означает ли это, что я должен использовать malloc () для всех структур и размещения новых, чтобы построить их на месте?Таким образом, я мог звонить бесплатно (р) каждый раз.