Я проектирую классическую виртуальную машину, которая будет работать на каком-то типичном значении с переключением типов - теперь представлено помеченным объединением:
typedef struct val {
val_type type;
union {
int i;
unsigned int u;
double f;
str * str;
vec * vec;
map * map;
};
} val;
Я нашел много литературы об этом в Интернете и пришел к выводу, что это довольно ортодоксальный подход к проблеме. Однако мне интересно, можно ли улучшить производительность с помощью такого подхода:
typedef struct val_int {
val_type type;
int i;
};
typedef struct val_str {
val_type type;
char * buffer;
size_t length;
size_t capacity;
};
typedef struct val_vec {
val_type type;
val_type ** members; // <-- access member by cast
size_t length;
size_t capacity;
};
Здесь я рассуждаю о том, что существует компромисс между стоимостью дополнительной косвенной ссылки для доступа к примитивным типам (а также необходимостью выполнения отдельных распределений - возможно, с помощью объединения), удерживаемой в отношении памяти, сохраненной в коллекциях, таких как val_vec
, уменьшив наполовину размер указателя, который он представляет в данный момент. Я знаю, что простым ответом здесь будет «измерить его», но у меня возникают проблемы с созданием адекватно репрезентативной модели, которая не является полной реализацией.
Есть ли название для этого второго подхода, и - если предположить, что этим будет управлять осторожно (но не , если он не вызывает неопределенного поведения), существует широко понятый риск того, что я не приходится? Какой подход здесь предпочтительнее?
Кстати, может ли использование гибких элементов массива также использоваться аналогично?