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