最近为了好玩,我决定建立一个玩具编程,编译器和vm。在开始实施虚拟机时,我遇到了困难。保存变量和结构的堆栈我实现为每种类型的单独数组。问题是当我有一个结构的引用时,元素没有对齐,int struct.x可能在地址2,而float struct.y可能在地址56,所以通过引用访问struct是不可能的,因为索引不是线性的。我怎么能解决这个问题?
编辑:
首先,对于每种类型,我的意思是每个原语,其次我知道我可以用工会实现它,但我想知道它是如何在java,c ++或c#中真正实现的,这是一种制作方法一种玩具语言,以便更好地理解你的编程。
答案 0 :(得分:0)
在这种情况下,您没有真正的选择,只能使用像uin32_t / uint64_t这样的单一数据类型,只需让编译器将值分解为整数
int sp = 0;
uint32_t stack[MAX_STACK_SIZE];
OR
像其他人所说的那样,创建一个堆栈,它是一个联合数组,可能使用标记的联合。一种实现可能是......union values {
int i;
float f;
};
struct Type {
int tag;
union values val;
};
Type stack[MAX_STACK_SIZE];
由您来决定这一点,但通常是这样做的。