void*
можно преобразовать в любой тип данных, вы можете сделать void *var = new char
и допустимо, но void
не имеет размера, поэтому бесполезно выделять разные типы вместе, потому что вам нужно знать тип чтобы разыменовать указатель (и / или длину для его итерации), но вы не знаете его, если только вы не отслеживаете все типы, но, как вы можете предположить, это действительно неэффективно.
Если вы хотите выделить память для разных типов данных, сделайте это правильно, то есть указатель для каждого типа:
int * foo;
foo = new int[N];
char * bar;
bar = new bar[N];
Что касается неэффективности, имейте в виду, что вы есть два способа, рассчитать наихудший сценарий и зарезервировать память во время компиляции (т.е. char charArray[50]; int intArray[200]
), или использовать new / delete для выделения памяти на основе требований времени выполнения (что и будет делать stl под капотом, если только вы используете std::array
)