我正在设计一个经典的虚拟机,它将在某种通用的、类型切换的值上运行——现在用一个标记的联合表示:
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
,减半)之间进行权衡它表示的当前胖指针的大小。我知道这里的简单答案将是“衡量它”,但我无法提出一个具有充分代表性的模型,该模型本身并不是一个完整的实现。
是否有第二种方法的名称,并且 - 假设这将被仔细管理(但不假设它不会导致未定义的行为)是否存在我没有考虑到的广泛理解的风险?这里最好采用哪种方法?
顺便说一句,是否也可以类似地使用灵活的数组成员?