Если вы на самом деле храните несколько типов в смежном буфере, вам может быть очень больно, когда речь заходит о проблемах выравнивания. Не все типы могут быть выровнены на одних и тех же границах памяти: некоторым может потребоваться выравнивание по 32-разрядным, другим - 64-разрядным, а некоторым - 128-разрядным, и это зависит от платформы.
Некоторое чтение, чтобы начать работу , но вы должны прочитать намного больше, включая выравнивание пользовательских типов, а также для различных компиляторов и операционных систем, на которые вы ориентируетесь, если вы действительно хотите это сделать как вы делаете, не используя более структурированный подход (например, подходы типа Variant, сочетающие статический и динамический полиморфизм).
Фактически, материал, который вам нужно понять, если вы хотите это сделать, очень похож на то, что вы должны узнать о выравнивании данных при реализации своего собственного распределителя памяти (общий распределитель памяти должен иметь дело со способностью хранить несколько типов в смежных буферах), поэтому поиск похожих тем может дать вам то, что вам нужно. Я не могу не сказать, что эта проблема низкого уровня может принести вам и вашим коллегам гораздо больше горя, чем кто-либо должен был бы заслужить.
Вам необходимо знать, какие типы должны быть выровнены по каким границам (байт, слово, двойное слово, четырехсловное слово). Это также меняется. Например, вы не можете хранить int, который не выровнен по границам слова. В некоторых системах это может привести к огромным потерям производительности для невыровненных ходов или даже к аварийному завершению вашей программы. По этой же причине структуры обычно имеют отступы внутри, чтобы обеспечить правильное выравнивание всех данных.
Однако, для вашего непосредственного примера, который не смешивает типы (только целые числа):
unsigned char *p = new unsigned char[sizeof(int) * 2];
int *x = &*(int *) p;
*x = 1;
// advance your unsigned char* pointer by the size of x
p += sizeof x; // or sizeof(int)
int *y = &*(int *) p;
*y = 2;